繁体   English   中英

如何根据按不同对分组的列值选择行?

[英]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,则支持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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM