从查询结果中挑选出一些条目

时间:2017-08-14 13:13:14

标签: sql-server-2008 sorting

我无法用语言解释我想要的是什么,这就是为什么我更愿意展示一个小例子。

我正在使用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 ...

提前致谢

2 个答案:

答案 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)来获取更早的日期。

<强>输出:

enter image description here

在这里演示:

Rextester

<强>更新

这是一个通用查询,它将返回每个组的整个最大记录以及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中选择*