我有一個名為 Mytable 的表,如下所示:
| 代碼 | 日期 | 名稱1 | 名稱 2 | 價錢 |
|---|---|---|---|---|
| ABC123 | 2022-03-14 | 我的名字1 | 我的名字2 | 4 |
| ABC123 | 2022-03-14 | 我的名字1 | 我的名字2 | 5 |
| ABC123 | 2022-03-13 | 我的名字1 | 我的名字2 | 4 |
| ABC123 | 2022-03-13 | 我的名字1 | 我的名字2 | 5 |
| ABC456 | 2021-12-31 | 我的名字1 | 我的名字2 | 4 |
| ABC456 | 2021-12-31 | 我的名字1 | 我的名字2 | 5 |
| ABC456 | 2021-03-13 | 我的名字1 | 我的名字2 | 4 |
| ABC456 | 2021-03-13 | 我的名字1 | 我的名字2 | 5 |
| DEF123 | 2022-03-13 | 其他名稱1 | 其他名稱2 | 4 |
| DEF123 | 2022-03-14 | 其他名稱1 | 其他名稱2 | 5 |
我只想得到這行:
| 代碼 | 日期 | 名稱1 | 名稱 2 | 價錢 |
|---|---|---|---|---|
| ABC123 | 2022-03-14 | 我的名字1 | 我的名字2 | 4 |
| ABC123 | 2022-03-14 | 我的名字1 | 我的名字2 | 5 |
| ABC456 | 2021-12-31 | 我的名字1 | 我的名字2 | 4 |
| ABC456 | 2021-12-31 | 我的名字1 | 我的名字2 | 5 |
也就是說,我想用 Name1=Myname1 和 Name2=Myname2 對行進行子集化:
SELECT * FROM Mytable WHERE Name1='Myname1' AND Name2='Myname2'
但我不想要所有這些。我只需要每個代碼的最近日期的行。每個代碼都有不同的最近日期。我認為我可以通過以下方式獲取每個代碼的最新日期:
SELECT Code, MAX(Date) FROM Mytable WHERE Name1='Myname1' AND Name2='Myname2' GROUP BY Code
但我不知道如何在一個查詢中組合這兩個子集,因為將其余列名添加到最后一個查詢不起作用:
SELECT Name1, Name2, Code, MAX(Date) FROM Mytable WHERE Name1='Myname1' AND Name2='Myname2' GROUP BY Code
謝謝!!
uj5u.com熱心網友回復:
SELECT Code, [Date], Name1, Name2, Price
FROM (
SELECT *, dense_rank() over (partition by code order by code, [date] desc) rn
FROM [Mytable]
WHERE Name1='Myname1' AND Name2='Myname2'
) T
WHERE rn = 1
在這里看到它的作業:
https://dbfiddle.uk/?rdbms=sqlserver_2019&fiddle=66c6ec98a906a8a49ac5e55e1d1a6ac2
uj5u.com熱心網友回復:
嘗試將 Name1 和 Name2 添加到分組依據
SELECT
Name1,
Name2,
Code,
MAX(Date) AS "Date",
Price
FROM Mytable
WHERE Name1='Myname1'
AND Name2='Myname2'
GROUP BY Code, Name1, Name2
uj5u.com熱心網友回復:
我從來沒有真正使用過partition(出于無知)所以我可能只是寫這個。優化器應該讓它運行得足夠快,而且超級容易理解。
SELECT Code, Date, Name1, Name2, Price
FROM Mytable t1
WHERE Date IN (
SELECT MAX(Date)
FROM Mytable t2
WHERE t1.Code = t2.Code
)
AND Name1 = 'Myname1'
AND Name2 = 'Myname2'
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/448989.html
標籤:sql
上一篇:從連接表中選擇最大值
