2011-07-07 179 views
6

如果记录的大体同一类型的数据如何选择最近的记录...选择最近的记录

例如:

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 
+1

你是什么意思'基于col4'?你是说最大的col4价值吗?如果第二行的“col2”值为“abcd”,那么您希望的输出是什么? –

+1

安倍,我想知道同样的事情......答案可能认为“GROUP BY”解决方案不合适。 –

+0

如果col2是不同的值,那么整个场景会有所不同,我会有这个col。当所有行的col4值相同时,输出将会发生作用。 – Shahsra

回答

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不会为派生表方法提供任何优化。

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或其他一些处理方法。

+0

非常感谢。 – Shahsra

+0

潜在的问题是'col4'值可能被复制,所以它不会返回不同的行。这就像使用DENSE_RANK功能... –

-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 

这将返回您想要的结果

+0

不。这不会为每个col1值返回一行 - 请参阅问题 – Bohemian

+0

中的预期结果我刚刚运行了上述查询,它的确如此。它与他提供的样本数据集有关吗?我觉得我在这里错过了一些东西,但我不知道是什么...... –

+0

如果col2和col3在给定col1的行之间有所不同,那么该怎么办? - 这个问题并不清楚(但它会接近无用的数据if它没有变化),在这种情况下,你的查询将无法工作。 – Bohemian

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; 
+0

.... Slowpoke:p –

+0

如果您下次包含DDL和样本数据,也许我会赢。 :-) –

+0

什么 - CREATE DATABASE语句在哪里?如果你看起来足够接近,这个答案有一个厨房水槽=) –