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 以及日期?
使用AGGREGATE
像MIN
或这样的函数MAX
。
如果您只需要每个 ID 一个记录,则必须选择您想要的日期。第一个 (MIN) 或最新的 (MAX)。
^^以上信息不是所要求的。
根据评论中的说明进行编辑:只需使用 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)
获得相同结果的更多方法:
首先,使用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 中测试。