2012-12-18 34 views
0

我在我的數據庫中的以下信息:如何根據按不同對分組的列值來選擇行?

TO | FROM | DATE | PRICE 
AAA | BBB | 12/3/2012 | $100 
AAA | CCC | 12/3/2010 | $200 
AAA | BBB | 10/3/2010 | $450 
BBB | CCC | 09/7/2010 | $270 
BBB | AAA | 06/9/2011 | $130 
AAA | CCC | 12/3/2013 | $176 

我想編寫一個查詢(或LINQ表達最好)至 - 自對,所以基於表上面我想要的是選擇最近的以下數據在我的查詢中返回:

TO | FROM | DATE | PRICE 
AAA | BBB | 12/3/2012 | $100 
BBB | CCC | 09/7/2010 | $270 
BBB | AAA | 06/9/2011 | $130 
AAA | CCC | 12/3/2013 | $176 

要做到這一點,最好的方法是什麼?

回答

0

既然你沒有提到你的RDBMS,下面的查詢工作在最RDBMS

SELECT a.* 
FROM tableName a 
     INNER JOIN 
     (
      SELECT To, FROM, MAX(DATE) maxDate 
      FROM tableName 
      GROUP BY To, FROM 
     ) b ON a.To = b.To AND 
       a.FROM = b.FROM AND 
       a.DATE = b.maxDATE 

但如果你RDBMS支持CTEWINDOWS FUNCTION

WITH latestRecord AS 
(
SELECT [To], [FROM], DATE, Price, 
     ROW_NUMBER() OVER (Partition BY [TO], [FROM] ORDER BY date DESC) rn 
FROM tableName 
) 
SELECT [To], [FROM], DATE, Price 
FROM latestRecord 
WHERE rn = 1 

WINDOWS FUNCTION ONLY

SELECT [To], [FROM], DATE, Price 
FROM 
(
    SELECT [To], [FROM], DATE, Price, 
      ROW_NUMBER() OVER (Partition BY [TO],[FROM] ORDER BY date DESC) rn 
    FROM tableName 
) s 
WHERE rn = 1 

還有一點需要指出的是,TOFROM有些保留關鍵字,它們必須用轉義字符轉義這取決於您正在使用的RDBMS

+0

謝謝。我想出了同樣的東西,我只是不確定是否有更簡單的方法 – Matt

相關問題