选择最近的记录

时间:2011-07-07 21:26:47

标签: sql sql-server sql-server-2005 tsql sql-server-2008

如果记录具有几乎相同类型的数据,如何选择最新记录...

示例:

col1       col2          col3              col4
--------------------------------------------------
123         abc          1.1               12345
123         abc          1.1               123445
1234        dsv          2.0               123
1234        dsv          2.0               1233
12345       dsvw         1.2               1234

与其他列进行比较时的最大值col4

请参阅row1和row2数据看起来相似,但我们需要基于col4的最新数据。

与row3和row4相同,数据看起来相似,但我们需要基于col4的最新数据。

所需的输出是:

col1    col2   col3   col4
----------------------------
123     abc    1.1    123445
1234    dsv    2.0    1233
12345   dsvw   1.2    1234 

4 个答案:

答案 0 :(得分:5)

我认为“最新”意味着“最大”?

DECLARE @t TABLE
(
    col1 INT, 
    col2 CHAR(3), 
    col3 DECIMAL(4,1), 
    col4 INT
);

INSERT @t SELECT 123, 'abc', 1.1, 12345
UNION SELECT 123, 'abc', 1.1, 123445
UNION SELECT 1234, 'dsv', 2.0, 123
UNION SELECT 1234, 'dsv', 2.0, 1233;

WITH t AS
(
    SELECT col1, col2, col3, col4,
        rn = ROW_NUMBER() OVER
            (PARTITION BY col1 ORDER BY col4 DESC)
        FROM @t
)
SELECT col1, col2, col3, col4
    FROM t
    WHERE rn = 1;

答案 1 :(得分:3)

使用:

WITH example AS (
   SELECT t.*,
          ROW_NUMBER() OVER (PARTITION BY t.col1
                                 ORDER BY t.col4 DESC) AS rnk
     FROM YOUR_TABLE t)
SELECT e.*
  FROM example e
 WHERE e.rnk = 1

..或:

SELECT e.*
  FROM (SELECT t.*,
               ROW_NUMBER() OVER (PARTITION BY t.col1
                                      ORDER BY t.col4 DESC) AS rnk
          FROM YOUR_TABLE t) e
 WHERE e.rnk = 1

CTE不提供对派生表方法的任何优化。

答案 2 :(得分:0)

这样做你想要的:

select * from table t
where col4 = (select max(col4) from table where col1 = t.col1);

您可以根据需要在测试中添加其他列(如果需要,则不清楚问题),例如:

select * from table t
where col4 = (select max(col4) from table
              where col1 = t.col1 and col2 = t.col2 and col3 = t.col3);

注意:如果有多个记录共享col4的相同最大值,则会返回多行。这可能不是问题,或者您可以根据需要使用DISTINCT或其他一些治疗。

答案 3 :(得分:-1)

由于所有其他答案,我觉得我错过了一些东西,但在我看来这是一个简单的MAX/group by

with temp as
(
select 123 as col1,'abc' as col2, '1.1' as col3, 12345 as col4
UNION
select 123, 'abc', '1.1'  ,123445
UNION
select 1234,'dsv','2.0' ,123
UNION
select 1234,'dsv' ,'2.0'  ,1233

)

SELECT col1, Col2, COl3, MAX(Col4)
FROM temp
GROUP BY col1, col2,col3

这会返回您想要的结果