【问题标题】:SQL Group by date with multiple same resultsSQL 按日期分组,具有多个相同的结果
【发布时间】:2020-08-30 04:08:23
【问题描述】:

如何编写按日期对数据进行分组但显示数据首次更改时间的语句

日期 - 数据更改的时间

a,b,c - 一些数据,它可以是任何东西

date,a,b,c
04/26/2008,1,1,1
04/25/2008,1,2,1
04/24/2008,1,1,1
04/23/2008,1,1,1
04/22/2008,1,1,1
04/21/2008,2,2,2
04/20/2008,1,1,1

这应该是结果。它可能在不同日期有相同的数据,但是当数据保持不变时,它会在第二天丢失。

04/26/2008,1,1,1
04/25/2008,1,2,1
04/22/2008,1,1,1
04/21/2008,2,2,2
04/20/2008,1,1,1

它应该可以在 MS SQL Server 2008 r2 上运行

【问题讨论】:

  • 到目前为止你尝试了什么?

标签: sql sql-server tsql sql-server-2008-r2 gaps-and-islands


【解决方案1】:

这就像gaps and islands problem

 create table yourtablename ([date] date,a int,b int,c int);
insert into yourtablename values
 ('04/26/2008',1,1,1)
,('04/25/2008',1,2,1)
,('04/24/2008',1,1,1)
,('04/23/2008',1,1,1)
,('04/22/2008',1,1,1)
,('04/21/2008',2,2,2)
,('04/20/2008',1,1,1);

; with cte as 
(
select date, a,b,c,combinedstring=cast(a as varchar(max))+ cast(b as varchar(max))+ cast(c as varchar(max))
from yourtablename 
)
,cte2 as 
(select *,
rn1=row_number() over (partition by combinedstring order by date asc)
,rn2= row_number() over (order by date asc) 
from cte
)
select y.* 
from 
(
select date=min(date)
from cte2
group by (rn2-rn1),combinedstring) t
join yourtablename y
on t.date=y.date

【讨论】:

    【解决方案2】:
    ; with cte as 
    (select *,
    row_number() over (partition by a,b,c order by date asc) as rn
    ,row_number() over (order by date asc) as rn1
    from yourtablename
    )
    select min(date) date,a,b,c from cte group by (rn1-rn),a,b,c
    order by min(date) desc
    

    查看以下链接

    For reference click here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-12
      • 2019-03-05
      • 2017-06-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多