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

合并SQL中的相邻行?

关志
2023-03-14
问题内容

我根据员工的工作时间做一些报告。在某些情况下,数据包含两个单独的记录,这实际上是一个时间段。

这是该表的基本版本和一些示例记录:

EmployeeID
StartTime
EndTime

数据:

EmpID      Start         End
----------------------------
#1001   10:00 AM    12:00 PM
#1001    4:00 PM     5:30 PM
#1001    5:30 PM     8:00 PM

在该示例中,最后两个记录在时间上是连续的。我想编写一个查询,该查询结合了所有相邻记录,因此结果集是这样的:

EmpID      Start         End
----------------------------
#1001   10:00 AM    12:00 PM
#1001    4:00 PM     8:00 PM

理想情况下,它还应该能够处理两个以上的相邻记录,但这不是必需的。


问题答案:

本文为您的问题提供了许多可能的解决方案

http://www.sqlmag.com/blog/puzzled-by-t-sql-blog-15/tsql/solutions-to-
packing-date-and-time-intervals-
puzzle-136851

这似乎是最直接的方法

WITH StartTimes AS
(
  SELECT DISTINCT username, starttime
  FROM dbo.Sessions AS S1
  WHERE NOT EXISTS
    (SELECT * FROM dbo.Sessions AS S2
     WHERE S2.username = S1.username
       AND S2.starttime < S1.starttime
       AND S2.endtime >= S1.starttime)
),
EndTimes AS
(
  SELECT DISTINCT username, endtime
  FROM dbo.Sessions AS S1
  WHERE NOT EXISTS
    (SELECT * FROM dbo.Sessions AS S2
     WHERE S2.username = S1.username
       AND S2.endtime > S1.endtime
       AND S2.starttime <= S1.endtime)
)
SELECT username, starttime,
  (SELECT MIN(endtime) FROM EndTimes AS E
   WHERE E.username = S.username
     AND endtime >= starttime) AS endtime
FROM StartTimes AS S;


 类似资料:
  • 问题内容: 我想实现 .NET的时间段库中 提供的类似功能,但要实现SQL中的类似功能。 首先,我有一个表,其中有几行带有开始日期和结束日期, 我想像这样将它们合并在一起: 组合 然后,根据该结果和另一个来自不同表的结果,我想 找出它们两者之间的交集,像这样,但是只有2个输入 (找到两个中都存在的周期): 路口 一旦我有了交叉路口,便只是在上面总结时间。 在这里,我通过示例提供了一个SQL Fid

  • 在SQL Server中,我有两个来自两个表的查询。 第一个表“Values1”有两列:“index1”和“value1”。第二个表“Values2”有“index2”和“value2”列。 我想要一个查询,对于一对索引值“d1”和“d2”,可以输出所有“index1”和“value e1”行,其中对应的index1在“d1”和“d2”之间,以及“Values2”表中具有“index2”值在“d1

  • 问题内容: 我不知道如何很好地解释这一点,所以请多多包涵。 我试图对彼此相邻的相似行进行分组,如果相同,则基本上忽略第n + 1行。我不确定这在MySQL中是否容易实现。这些行除描述外不共享其他任何属性。如果还有其他不重复的“描述”,我仍然希望将它们返回。 我有一张桌子,上面满是这样的条目: 问题答案: 您可以使用巧妙的技巧来做到这一点。诀窍是计算与特定id 不同 的描述的数量。对于序列中的值,此

  • 问题内容: 假设我的数据库中有以下两段XML 此数据使用数据类型存储在两个单独的表中,此外,此XML列链接到描述所需xml格式的模式,例如 在存储过程/函数中,我想将这两个XML结构合并为以下内容: 因此,从xml的第一部分开始,我们采取了以下措施: 从第二段xml中我们获得了以下内容: 注意,这两段XML有一个共同的项目,其关键是: 在这种情况下,应在合并的xml中使用xml 2中的值(丢弃xm

  • 以下是一个采访问题,我无法回答的复杂性低于指数复杂性。虽然这似乎是一个DP问题,但我无法形成基本案例并正确分析它。感谢您的帮助。 将为您提供两个大小为“n”的数组。您需要稳定地合并这些数组,以便在新数组中使连续元素的乘积之和最大化。 例如 A={2,1,5} B={3,7,9} 稳定合并A={a1,a2,a3}和B={b1,b2,b3}将创建一个包含2*n个元素的数组C。例如,通过合并(稳定的)A