查找 ID 相同但日期不同的行

Moh*_*suf 1 sql-server sql-server-2012

考虑下表tbl:

id    date
1     2016
1     2017
2     2017
2     2017
3     2016
3     2017
4     2018
5     2018
Run Code Online (Sandbox Code Playgroud)

如何仅获取具有相同 ID 但不同日期的行。

现在我只能获得超过 1 个计数的 id,如下所示:

select id, date
from tbl
group by id
having count(id)>1
Run Code Online (Sandbox Code Playgroud)

我怎样才能只获得 id 1 和 3 以及日期?

SQL*_*DBA 6

使用AGGREGATEMIN或这样的函数MAX

如果您只需要每个 ID 一个记录,则必须选择您想要的日期。第一个 (MIN) 或最新的 (MAX)。

https://docs.microsoft.com/en-us/sql/t-sql/functions/aggregate-functions-transact-sql?view=sql-server-2017

^^以上信息不是所要求的。

根据评论中的说明进行编辑:只需使用 HAVING 来确定哪些 ID 值具有多个日期,然后将其应用于新的 SELECT。

SELECT id, Date
FROM tbl
WHERE id IN
    (
        select id 
        from tbl
        group by id
        having count(distinct date)>1
    )
Run Code Online (Sandbox Code Playgroud)


ype*_*eᵀᴹ 5

获得相同结果的更多方法:

首先,使用min(date) < max(date)作为HAVING条件 - 而不是count(distinct date) > 1. 也许效率更高一点:

select id, date
from tbl
where id in 
      ( select id
        from tbl
        group by id
        having min(date) < max(date)
      ) ;
Run Code Online (Sandbox Code Playgroud)

或带有JOIN

select t.id, t.date
from tbl as t
     join 
      ( select id
        from tbl
        group by id
        having min(date) < max(date)
      ) as g
      on g.id = t.id ;
Run Code Online (Sandbox Code Playgroud)

和一个转换IN为相关EXISTS子查询。奖励,我们可以删除GROUP BY

select id, date
from tbl as t
where exists
      ( select 1
        from tbl as t2
        where t.id = t2.id
          and t.date <> t2.date
      ) ;
Run Code Online (Sandbox Code Playgroud)

另一个使用窗口函数:

select id, date
from
  ( select id, date,
           diff_dates = case when min(date) over (partition by id)
                                < max(date) over (partition by id)
                             then 1
                        end 
    from tbl
  ) as d
where diff_dates = 1 ;
Run Code Online (Sandbox Code Playgroud)

最后,混淆竞赛的一个:

select id, date from tbl
except
select id, min(date) from tbl group by id
intersect
select id, max(date) from tbl group by id ;
Run Code Online (Sandbox Code Playgroud)

dbfiffle 中测试。