SQL Server 2008/12问题。我将尝试给出一个简化的解释。
带有数据表
赞:
create table #temp
(
id varchar (5),
code varchar (3),
dt varchar(8)
)
insert into #temp (id,code,dt)
values ('abc00', '2', '20180101'), ('abc01', '1', '20180201'),
('def00', '1', '20180201'), ('def01', '2', '20180101'),
('ghi00', '2', '20180101'), ('ghi01', '1', '20180102'),
('jkl00', '1', '20180101')
我需要一个或多个执行以下操作的选择查询:
对于整个表格,如果ID的前3个字符相等,则它们是“相关”的ID(left(id, 3)
相同)
因此,对于每个“一组”相关ID,请找到min(id)
和max(id)
,然后确保min(id).date < max(id).date
我已经尝试过涉及OVER(PARTITION id)
,CTE自我连接和临时表的答案,但是我无法理解如何将它们组合在一起以使其正常工作。
我似乎在寻找相关ID的不同行时陷入困境。
我正在比较每个相关ID的日期,找出哪个更大。如果我能完成工作,我想我可以把它带回家。
我从另一个线程(Compare dates between 2 different rows and columns)获得了一些帮助,但是限制当前行和所有“相关” ID之间的搜索的增加的复杂性让我很沮丧,这就是我在轰炸的地方
这是到目前为止我得到的:
select *
from #temp
where cast(dt as date) > (select top 1 cast(dt as date)
from #temp AS sub
where sub.id in (select id
from #temp
where (left(#temp.id, 3) = left(sub.id, 3))
and (#temp.id <> sub.id))
order by id)
...但是没有返回任何行。我整天都在头。
修改:
作为我在这里期望的示例:
使用此stmt:
select *
from #temp sub
where 'abc' = left(sub.id, 3) and ('abc01' <> sub.id)
我得到这个结果:
id code dt
----- ---- --------
abc00 2 20170101
感谢@Philip的编辑提示
有人可以帮忙吗?
感谢阅读。
答案 0 :(得分:1)
我想你想要这个吗?
select * from #temp
where cast(dt as date) >
(select TOP 1 cast(dt as date) from #temp AS sub
where (left(sub.id,3)) in
(
select (left(id,3)) AS Id from #temp where (left(#temp.id,3) = left(sub.id,3)) AND #temp.id != sub.id
)
)
答案 1 :(得分:0)
像这样吗?
select
grp = left(id, 3),
MinDt = min(dt),
MaxDt = max(dt)
from #temp
group by left(id, 3)
having min(dt) < max(dt)