当前位置: 首页 > 面试题库 >

当一个的结束时间是另一个的开始时间时合并行

桂坚
2023-03-14
问题内容

我在编写查询时遇到困难。我需要将时间连续状态的行合并为一个状态。例如,给定数据

start                    end                      state   seconds
2011-04-21 08:13:30.000  2011-04-21 08:18:00.000  STATE1  270
2011-04-21 08:18:00.000  2011-04-21 08:22:30.000  STATE1  270
2011-04-21 08:22:30.000  2011-04-21 08:26:26.000  STATE1  236
2011-04-21 08:26:26.000  2011-04-21 08:26:47.000  STATE2  21
2011-04-21 08:26:47.000  2011-04-21 08:27:30.000  STATE3  43
2011-04-21 08:27:30.000  2011-04-21 08:28:20.000  STATE1  50
2011-04-21 08:40:30.000  2011-04-21 08:41:00.000  STATE1  30

我只需要合并行,row2.state = row1.state AND row2.start = row1.end并得出状态的总体开始和结束时间。结果应为:

start                    end                      state   seconds
2011-04-21 08:13:30.000  2011-04-21 08:26:26.000  STATE1  776
2011-04-21 08:26:26.000  2011-04-21 08:26:47.000  STATE2  21
2011-04-21 08:26:47.000  2011-04-21 08:27:30.000  STATE3  43
2011-04-21 08:27:30.000  2011-04-21 08:28:20.000  STATE1  50
2011-04-21 08:40:30.000  2011-04-21 08:41:00.000  STATE1  30

这是示例SQL:

CREATE TABLE Data (
    ID int IDENTITY(1,1) not null,
    Date DateTime not null,
    State nvarchar(40) not null,
    Seconds int not null,
    PRIMARY KEY(ID)
);
INSERT INTO Data(Date,State,Seconds) VALUES('2011-04-21 08:13:30.000', 'STATE1', 270)
INSERT INTO Data(Date,State,Seconds) VALUES('2011-04-21 08:18:00.000', 'STATE1', 270)
INSERT INTO Data(Date,State,Seconds) VALUES('2011-04-21 08:22:30.000', 'STATE1', 236)
INSERT INTO Data(Date,State,Seconds) VALUES('2011-04-21 08:26:26.000', 'STATE2', 21)
INSERT INTO Data(Date,State,Seconds) VALUES('2011-04-21 08:26:47.000', 'STATE3', 43)
INSERT INTO Data(Date,State,Seconds) VALUES('2011-04-21 08:27:30.000', 'STATE1', 50)
INSERT INTO Data(Date,State,Seconds) VALUES('2011-04-21 08:40:30.000', 'STATE1', 30)

SELECT Date as 'start', DATEADD(s,Seconds,Date) as 'end', State, Seconds FROM Data

提前致谢!


问题答案:

试试这个(> = SQL Server 2005):

WITH qry AS
(
    SELECT  a.*
                    ,ROW_NUMBER() OVER (ORDER BY [start]) rn
    FROM    (SELECT Date as 'start', DATEADD(s,Seconds,Date) as 'end', State, Seconds FROM Data) a
)
SELECT  DISTINCT MIN(a.start) OVER(PARTITION BY a.State, a.[end] - ISNULL(b.start, a.start)) ,
                MAX(a.[end] ) OVER(PARTITION BY a.State, a.[end] - ISNULL(b.start, a.start)) ,
                a.state
                ,SUM(a.Seconds) OVER(PARTITION BY a.State, a.[end] - ISNULL(b.start, a.start))

  FROM qry a LEFT JOIN qry b
        ON a.rn + 1 = b.rn
   AND a.[end] = b.start


 类似资料:
  • 问题内容: 我似乎无法弄清楚这个查询。我需要将时间连续状态的行合并为一个状态。 这个问题与这里找到的问题类似,除了我使用的是Oracle 10而不是SQL Server: 当一个的结束时间是另一个的开始时间时合并行 示例数据: 我想得到以下输出: 这是示例SQL: 提前致谢! 问题答案: 也许这个吗?(我没有运行它的SQL机器)

  • 我的数据来自MS SQL数据库,它与员工的工作时间有关。 问题是,开始时间和结束时间存储为两个不同的条目,因此当员工来时,他扫描他的徽章,这被视为到达时间,当他离开时,他再次扫描他的徽章,这被视为离开时间。有一列有助于区分开始时间和结束时间(CodeNr列:B1=开始时间,B2=结束时间) 这就是我的桌子的样子 现在我需要这个数据作为一个单一的条目,在Talend oder从数据库, 所以看起来应

  • 我有一个enum,其值如下:,,等。 我试图编写一个方法,它接受并返回该时间段的开始和结束日期。 我研究了新的Java8类,该类可能需要一个开始时间和结束时间,但似乎没有任何干净的方法可以在之后检索这些值。 如果不使用(似乎是错误的数据结构)或一些难看的日期时间算法,我如何能一次干净地返回开始日期和结束日期?

  • 我的日期格式为:YYYY-MM-DD 所需的输出格式是:"yyyy-MM-dd'T'HH: mm: ss.SSS'Z'" 我想在美国/芝加哥时区获得ISO格式的日期,作为一天的开始时间(从上午12:00开始)和一天的结束时间(结束于晚上11:59)。 对于eg.日期: 2020-06-08(6月8日)转换后的最终输出如下: 当天开始时间为日期: 2020-06-08T05:00:00.000Z 截

  • 我有这样的桌子 数据如下所示,开始时间和结束时间是连续的时间跨度: 因此,如果用户传递两个参数,则可以在任意时间段内选择* 它应该以如下方式返回表: 你看,棘手的部分是将原始的时间跨度削减到用户定义的时间跨度(@from-@To),我已经为此奋斗了一整天。请指教。 提前非常感谢你!!!