2012-12-18 37 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

相关问题