【问题标题】:Find Row Changes and Output to Table查找行更改并输出到表
【发布时间】:2016-06-29 12:48:58
【问题描述】:

我有一个如下结构的 SQL Server 表:

id     TransDate            PartType
======================================
1     2016-06-29 10:23:00   A1
2     2016-06-29 10:30:00   A1
3     2016-06-29 10:32:00   A2
4     2016-06-29 10:33:00   A2
5     2016-06-29 10:35:00   A2
6     2016-06-29 10:39:00   A3
7     2016-06-29 10:41:00   A4

我需要一个SELECT 语句,它将输出一个表,该表可以找到PartType 中的更改,并且看起来像这样(出于SSRS 目的):

PartType   StartTime             EndTime       
=======================================================
A1         2016-06-29 10:23:00   2016-06-29 10:32:00
A2         2016-06-29 10:32:00   2016-06-29 10:39:00
A3         2016-06-29 10:39:00   2016-06-29 10:41:00
A4         2016-06-29 10:41:00   NULL

请注意,StartTime 始终从最后一个 EndTime 开始,除非它是表中的第一条记录。

我的SELECT 声明应该是什么?我似乎无法获得预期的结果。

编辑:我使用的是 SQL Server 2008 R2;我应该指定的。

【问题讨论】:

    标签: sql select reporting-services sql-server-2008-r2 ssrs-2008-r2


    【解决方案1】:

    嗯,这是使用outer applygroup by 的一种方法:

    select t1.PartType, min(t1.TransDate) as StartTime, t2.TransDate
    from t t1
    outer apply
         (select top 1 t2.*
          from t t2
          where t2.PartType <> t1.PartType and t2.TransDate > t1.TransDate
          order by t2.TransDate asc
         ) t2
    group by t1.PartType, t2.TransDate;
    

    【讨论】:

    • 很少见外应用例子!
    • 那肯定是丢失的t 表别名。看看吧。
    • @controller 老兄,这个查询中有 两个 表!一个表的一个别名,一个 - 另一个。你不能自己修正几个错别字吗?
    • 再看看。
    • 不幸的是,这个修订后的答案给出的输出不符合 OP 中列出的要求。没有结束时间
    【解决方案2】:

    对于 SQL Server 2012 及更高版本,您可以使用:

    declare @t table (id int, transdate datetime2(0), parttype char(2))
    
    insert @t
    values
    (1,     '2016-06-29 10:23:00',   'A1'),
    (2,     '2016-06-29 10:30:00',   'A1'),
    (3,     '2016-06-29 10:32:00',   'A2'),
    (4,     '2016-06-29 10:33:00',   'A2'),
    (5,     '2016-06-29 10:35:00',   'A2'),
    (6,     '2016-06-29 10:39:00',   'A3'),
    (7,     '2016-06-29 10:41:00',   'A4')
    
    ;with x as (
    select *, row_number() over(partition by parttype order by transdate) rn
    from @t
    )
    select parttype, transdate starttime, lead(transdate) over (order by transdate) from x where rn = 1
    

    【讨论】:

    • 抱歉,我使用的是 SQL Server 2008 R2。我已经编辑了 OP。
    猜你喜欢
    • 2021-11-14
    • 1970-01-01
    • 2016-10-27
    • 1970-01-01
    • 2022-08-05
    • 1970-01-01
    • 2021-12-07
    • 2013-12-13
    • 1970-01-01
    相关资源
    最近更新 更多