比较表中的日期,其中相似的列在不同的行中

时间:2018-06-20 19:01:05

标签: sql sql-server

SQL Server 2008/12问题。我将尝试给出一个简化的解释。

带有数据表

  • 第一个列包含ID,5个字符,
  • 第二列包含1个字符(始终= 1或2)的代码
  • 第三列包含YYYYmmdd格式的日期

赞:

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的编辑提示

有人可以帮忙吗?

感谢阅读。

2 个答案:

答案 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)