[英]How to select row based on column value grouped by distinct pairs?
我的数据库中包含以下信息:
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对,因此基于上表,我希望查询中返回以下数据:
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
做这个的最好方式是什么。
由于您没有提到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,则支持CTE
和WINDOWS 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
需要指出的另一点是, TO
和FROM
是保留关键字,必须使用转义的字符对其进行转义,这取决于您使用的RDBMS
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.