我无法用语言解释我想要的是什么,这就是为什么我更愿意展示一个小例子。
我正在使用SQL Server,并拥有此表:
col1 | col2 | col3
--------+----------+------------
john | conner | 01.01.1980
sarah | conner | 03.04.1978
john | conner | 01.01.1977
我有一个包含3个条目的表(例如),其中2个几乎与col3中的不同相同。
如何删除最小col3(01.01.1980)的条目并保留01.01.1977的条目,因此我将此表作为最终结果
col1 | col2 | col3
--------+----------+------------
sarah | conner | 03.04.1978
john | conner | 01.01.1977
我的问题就这么简单:我如何比较同一个表中的条目并获取几乎相同的条目,但是在col3中有一个不同的条件,即Age,我想要使用较旧的John Conner ...
提前致谢
答案 0 :(得分:0)
简单的GROUP BY
查询应该有效:
SELECT
col1,
col2,
MIN(CONVERT(datetime, col3, 104)) AS col3
-- or just MIN(col3) AS col3
FROM yourTable
GROUP BY
col1,
col2
我不确定您是将日期存储为文本还是实际日期。如果是前者,那么您可以使用CONVERT()
将其带到日期时间,然后再使用MIN()
。如果是后者,那么只需使用MIN(col3)
来获取更早的日期。
<强>输出:强>
在这里演示:
<强>更新强>
这是一个通用查询,它将返回每个组的整个最大记录以及tie:
SELECT
t.col1, t.col2, t.col3, t.col4, ...
FROM
(
SELECT t.*,
DENSE_RANK() OVER (PARTITION BY col1, col2 ORDER BY col3) dr
FROM yourTable t
) t
WHERE t.dr = 1;
如果您不想要联系,请将DENSE_RANK
替换为ROW_NUMBER
。
答案 1 :(得分:0)
CREATE TABLE TabStack ( col1 varchar(10), col2 varchar(10), col3日期 )
插入TabStack 值(
&#39;约翰&#39;&#39;康纳&#39;&#39; 01.01.1980&#39), (&#39;萨拉&#39;&#39;康纳&#39;&#39; 1978年3月4日&#39), (&#39;约翰&#39;&#39;康纳&#39;&#39; 1977年1月1日&#39)
与cte 如 ( 选择col1,col2,col3,ROW_NUMBER()over(按col1分区,col2 by col3)rn 来自TabStack )
从cte中删除 其中rn> 1
- 从TabStack中选择*