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

T-SQL查询组按日期顺序(gaps and islands)

燕经国
2023-03-14
问题内容

我有一个这样的示例表:

CREATE TABLE #Aggregate
(
     vKey       INT
    ,dKey       INT
    ,StartTrip  DATETIME
    ,EndTrip    DATETIME
    ,Distance   INT
)

像这样的一些样本数据

INSERT INTO #Aggregate
    (vKey, dKey, StartTrip, EndTrip, Distance )
VALUES
     (4940, 0, '2016-09-14 09:05:47.000', '2016-09-14 10:07:45.000', 25)
    ,(4940, 0, '2016-09-15 14:09:40.000', '2016-09-15 14:11:33.000', 35)
    ,(4940, 1202, '2016-09-16 17:07:04.000', '2016-09-16 18:07:04.000', 61)
    ,(4940, 0, '2016-09-26 16:43:03.000', '2016-09-26 16:44:52.000', 0)
    ,(4940, 0, '2016-09-28 11:13:41.000', '2016-09-28 11:14:33.000', 5)
    ,(4940, 1202, '2016-10-01 13:41:03.000', '2016-10-01 14:02:39.000', 500)
    ,(4940, 1202, '2016-10-01 21:52:14.000', '2016-10-01 21:54:28.000', 5)
    ,(4940, 0, '2016-10-01 10:27:44.000', '2016-10-01 10:36:24.000', 75)

我需要按日期顺序和vKey / DKey组合对数据进行分组,并像这样显示

vKey    dKey    StartTrip           EndTrip             Distance
4940    0       14/09/2016 09:05:47 15/09/2016 14:11:33 60
4940    1202    16/09/2016 17:07:04 16/09/2016 18:07:04 61
4940    0       26/09/2016 16:43:03 28/09/2016 11:14:33 5
4940    1202    01/10/2016 13:41:03 01/10/2016 21:54:28 505
4940    0       01/10/2016 10:27:44 01/10/2016 10:36:24 75

最好的方法是什么?

提前致谢


问题答案:

Select vKey
,dKey
,StartTrip = min(StartTrip)
,EndTrip = max(EndTrip)
,Distance = sum(Distance)
From (
Select * ,Island = Row_Number() over (Partition By vKey Order by Month(StartTrip)) - Row_Number() over (Partition By vKey,dKey Order by StartTrip)
From #Aggrgate
) A
Group By Island,vKey,dKey
Order By min(StartTrip)




 类似资料:
  • 问题内容: 我正在尝试对此表进行查询: 我想获得输出: 我想得到那个结果,所以我会知道什么时候开始赚钱,什么时候停止钱。我还对开始花钱之前的月份数(这解释了第一行)以及停止钱的月份数(这解释了为什么我也对2013年7月至2013年8月的第三行感兴趣)感兴趣。 )。 我知道我可以在日期上使用min和max,在金额上使用sum,但是我不知道如何以这种方式划分记录。 谢谢! 问题答案: 这是一个主意(和

  • 问题内容: 我有这个SQL查询: 结果是这样的: 我现在的问题是我无法将DateCreated分组,因为它具有不同的时间。 我只想按日期分组。范例:2010-09-12 谢谢并恭祝安康… 问题答案: 我认为值得单独发布以下内容: 使用char转换来削减超时日期(广播或转换为varchar)比使用慢。我制定了[完整的脚本和性能测试结果以支持此断言 另外,请注意,您的GROUP BY列表与SELECT

  • 问题内容: 假设我有一个查询“ select * from子句,其中id在(0,2,5,1,3)中”,我实际上希望返回的行以它们在where子句中指定的相同顺序返回。ID的顺序将随查询的不同而改变,并且该顺序没有模式。 我知道可以更改数据模型,创建临时表等。但是请相信我,这些类型的解决方案在我的情况下将行不通。我也无法在应用程序代码中更改结果对象的顺序。 我还知道,不同的数据库引擎对事物的排序方式

  • 问题内容: 我有一个要按日期在Angular.js中排序的数组: 列表不正确。我认为日期格式是原因吗? 日期格式为: 问题答案: 为了正常工作,您需要使用控制器中的对象包装字符串日期。 例如:

  • 问题内容: 我有这样的自定义订购需求: 我曾经想过用3个不同的选择查询的帮助下结合和。但是,我不能这样做,因为必须 在 和 之前 使用。 如何进行选择(或多个选择)以实现上面的自定义排序? 另一个解决方法可能会有所帮助,就是使此选择查询中返回的 第一条记录 成为最后一条记录,但是如何? 问题答案: 试试这个: 1亿个常量必须大于N。 这是一个简单的演示

  • 问题内容: 我在MySQL中有一张表,该表显示了我每天记录的小时数。我正在尝试建立一个视图,该视图将允许我按块/天范围快速将数据分组。最简单的情况是每月一次,这并不难。我可以将日期选择为“%y-%m”,然后按该列分组。 前任: 如果我按月分组,那很好。但是我的问题是,我需要从每月的13号到下个月的12号进行分组(例如:7月13日至8月12日,8月13日至9月12日,等等)。 有没有一种简单的方法可