如果记录具有几乎相同类型的数据,如何选择最新记录...
示例:
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
答案 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
这会返回您想要的结果