【问题标题】:Partition (segregate) by time period span in SQL在 SQL 中按时间段跨度分区(隔离)
【发布时间】:2018-09-29 15:05:29
【问题描述】:

我的问题是在 SQL 中将数据与时间信息分开

我有电车的交易数据。像这样的

DateTime
2018-04-03T08:06:04
2018-04-03T08:07:27
2018-04-03T08:18:18
2018-04-03T10:08:27
2018-04-03T10:22:24
2018-04-03T12:08:50
2018-04-03T12:24:49
2018-04-03T12:24:51

这是特定日期特定电车的客户点击信息。这包含 3 趟相同电车的旅程

  1. 第一次旅程 第一笔交易是 8:06,第二笔交易是 8:07,第三笔交易是 8:18
  2. 第二次旅程 第一笔交易在 10:08,第二笔交易在 10:22
  3. 第三次旅程 第一笔交易在 12:08,第二笔交易在 12:24,第三笔交易在 24:24

我怎样才能将它们列为 3 个不同的旅程,所以想要的结果会是这样的

Rank    DateTime
1   2018-04-03T08:06:04
1   2018-04-03T08:07:27
1   2018-04-03T08:18:18
2   2018-04-03T10:08:27
2   2018-04-03T10:22:24
3   2018-04-03T12:08:50
3   2018-04-03T12:24:49
3   2018-04-03T12:24:51

我尝试将时间增加 +- 40 分钟,该范围内的所有交易都将是一次独特的旅程。但是没能成功。

【问题讨论】:

  • 排名1,2,3的逻辑是什么,时间的另一个参数在哪里
  • 电车早上 8 点 06 分从第 1 站出发,早上 8 点 18 分到达第 15 站,然后继续行驶 30 站,然后在上午 10 点左右到达相同的第 1 站。上午 10:08 从第 1 站重新开始,在 10:22 到达第 16 站。因此循环持续一整天。
  • 所以硬编码 8 到
  • 不,它是动态的。一辆电车可以走5条上下路线。所以会有 5 个基于时差的唯一排名。

标签: sql google-bigquery


【解决方案1】:

以下是 BigQuery 标准 SQL

#standardSQL
SELECT dt, 1 + SUM(start) OVER(ORDER BY dt) journey 
FROM (
  SELECT dt, IF(TIMESTAMP_DIFF(dt, LAG(dt) OVER(ORDER BY dt), MINUTE) > 40, 1, 0) start
  FROM `project.dataset.table`
)

您可以使用您问题中的虚拟数据进行测试,如下所示

#standardSQL
WITH `project.dataset.table` AS (
  SELECT TIMESTAMP '2018-04-03T08:06:04' dt UNION ALL
  SELECT '2018-04-03T08:07:27' UNION ALL
  SELECT '2018-04-03T08:18:18' UNION ALL
  SELECT '2018-04-03T10:08:27' UNION ALL
  SELECT '2018-04-03T10:22:24' UNION ALL
  SELECT '2018-04-03T12:08:50' UNION ALL
  SELECT '2018-04-03T12:24:49' UNION ALL
  SELECT '2018-04-03T12:24:51' 
)
SELECT dt, 1 + SUM(start) OVER(ORDER BY dt) journey 
FROM (
  SELECT dt, IF(TIMESTAMP_DIFF(dt, LAG(dt) OVER(ORDER BY dt), MINUTE) > 40, 1, 0) start
  FROM `project.dataset.table`
)
-- ORDER BY dt 

结果

Row dt                          journey  
1   2018-04-03 08:06:04 UTC     1    
2   2018-04-03 08:07:27 UTC     1    
3   2018-04-03 08:18:18 UTC     1    
4   2018-04-03 10:08:27 UTC     2    
5   2018-04-03 10:22:24 UTC     2    
6   2018-04-03 12:08:50 UTC     3    
7   2018-04-03 12:24:49 UTC     3    
8   2018-04-03 12:24:51 UTC     3      

注意:我从您问题中的以下陈述中得出逻辑

我尝试将时间增加 +- 40 分钟,该范围内的所有交易都将是一次独特的旅程

稍微不那么冗长的版本:

#standardSQL
SELECT dt, 1 + COUNTIF(start) OVER(ORDER BY dt) journey 
FROM (
  SELECT dt, (TIMESTAMP_DIFF(dt, LAG(dt) OVER(ORDER BY dt), MINUTE) > 40) start
  FROM `project.dataset.table`
)
ORDER BY dt

【讨论】:

  • 太棒了。非常感谢 :) 我不知道 bigquery/SQL 中有任何此类逻辑。
  • @MikhailBerlyant 。 . .我实际上是要建议你不那么冗长的版本(实际上是一个轻微的变化),但后来我发现你已经有了它。
猜你喜欢
  • 2018-09-24
  • 1970-01-01
  • 1970-01-01
  • 2016-03-05
  • 2016-04-02
  • 2021-01-03
  • 2016-09-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多