我需要創建一個由 ID 鍵控的表,其中新表中一列的值是輸入到另一個表的列中的最早值,其中行共享相同的 ID 并具有特定的型別標簽。
例如,假設我希望為每個條目型別為 A 的水果輸入名稱和第一個值:
這些是我有的表:
表格1
| 鑰匙 | ID | 名稱 |
|---|---|---|
| 1 | 1 | 櫻桃 |
| 2 | 2 | 葡萄 |
表2
| 鑰匙 | ID | 價值 | 條目號 | 條目型別 |
|---|---|---|---|---|
| 1 | 1 | 21 | 1 | 一個 |
| 2 | 1 | 32 | 2 | 乙 |
| 3 | 1 | 4 | 3 | 乙 |
| 4 | 1 | 15 | 4 | 一個 |
| 5 | 2 | 3 | 1 | 乙 |
| 6 | 2 | 8 | 2 | 一個 |
| 7 | 2 | 16 | 3 | 乙 |
這是我想要的結果:
表3
| ID | 名稱 | 最早進入 |
|---|---|---|
| 1 | 櫻桃 | 21 |
| 2 | 葡萄 | 8 |
我嘗試了以下查詢,但它只為所有 EarliestEntry 回傳相同的值:
SELECT TABLE1.ID, TABLE2.Name,
(SELECT Value FROM (SELECT ROW_NUMBER() OVER (ORDER BY TABLE2.EntryNum)
as row_num, Value FROM TABLE2
WHERE TABLE2.ID = TABLE1.ID AND TABLE2.EntryType = 'A')
AS sub
WHERE row_num = 1) AS EarliestEntry
INTO TABLE3
FROM TABLE2
INNER JOIN TABLE1 ON TABLE1.ID = TABLE2.ID
GROUP BY TABLE1.ID, TABLE2.Type, TABLE2.EntryNum
我將不勝感激這方面的幫助。謝謝
uj5u.com熱心網友回復:
如果你想使用 ROW_NUMBER 函式,那么你需要把它放在 TABLE1 上并像這樣添加一個磁區:
WITH rn AS(
SELECT a.Key, ROW_NUMBER() OVER(PARTITION BY a.ID ORDER BY a.EntryNum) AS rn
FROM TABLE2 AS a
)
SELECT b.Name, a.Value AS EarliestValue
FROM TABLE2 AS a
INNER JOIN TABLE1 AS b ON b.ID = a.ID
INNER JOIN rn AS rn ON rn.key = a.key
WHERE rn.rn = 1
在您的示例中,您跳過了 PARTITION BY 子句,因此您只需獲得 TABLE2 中所有值的數字。而不是按升序排列每個 ID 的數字值。
uj5u.com熱心網友回復:
根據您對 TABLE1、TABLE2 和 TABLE3 三個表的描述。
我稍微修改了你的腳本。感謝 Dale K 的評論,我用一些詞來解釋解決方案:第一個選擇中顯示的欄位 TABLE2.Name 是錯誤的,因為 [name] 屬于 TABLE1,因此正確的語法是 TABLE1.name。并且在 GROUP BY 子句中,欄位 TABLE2.Type 可能會替換為 TABLE1.name 以符合聚合條件。所以腳本變成:
SELECT DISTINCT table1.id, table1.name,
(SELECT Value FROM (SELECT ROW_NUMBER() OVER (ORDER BY table2.EntryNum)
as row_num, Value FROM table2
WHERE table2.id = table1.id AND table2.EntryType = 'A')
AS sub
WHERE row_num = 1) AS EarliestEntry
INTO table3
FROM table2
INNER JOIN table1 ON table1.id = table2.id
GROUP BY table1.id, table1.name, table2.entrynum;
在這里,您可以使用小提琴驗證輸出
uj5u.com熱心網友回復:
你把這個問題復雜化了。
只需磁區Table2并取一個行號,然后將其加入Table1并過濾僅行號 1
SELECT
t1.Id,
t1.Name,
EarliestEntry = t2.Value
FROM Table1 t1
JOIN (
SELECT *,
rn = ROW_NUMBER() OVER (PARTITION BY t2.ID ORDER BY t2.EntryNum)
FROM Table2 t2
WHERE t2.EntryType = 'A'
) t2 ON t2.ID = t1.ID AND t2.rn = 1;
資料庫<>小提琴
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/401781.html
標籤:sql sql-server 查询语句 加入 选择
