选择最近的记录

Sha*_*sra 6 sql t-sql sql-server sql-server-2005 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
Run Code Online (Sandbox Code Playgroud)

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 
Run Code Online (Sandbox Code Playgroud)

Aar*_*and 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;
Run Code Online (Sandbox Code Playgroud)


OMG*_*ies 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
Run Code Online (Sandbox Code Playgroud)

..或者:

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
Run Code Online (Sandbox Code Playgroud)

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