【问题标题】:Calculating time_diff between rows with same id in GoogleBigQuery在 Google BigQuery 中计算具有相同 id 的行之间的 datediff
【发布时间】:2019-05-05 10:21:02
【问题描述】:

我正在使用 BigQuery 练习我的 SQL 技能,并且我正在尝试计算每辆自行车的自行车租赁之间的时间差。基本上,我想为每个不同的 ID 计算 time_diff,对于每一对具有相同自行车 ID 的行。我正在尝试找到每个 bikeid 的 time_diff 分布的中位数现在,我有:

SELECT bikeid,
       DATE_DIFF(date(start_time), date(prev_start_time), day) AS Tempo,
       OrderCount
FROM ( SELECT bikeid,
              start_time, 
              ROW_NUMBER() OVER(PARTITION BY bikeid ORDER BY start_time ASC) OrderCount,
              LAG(start_time) OVER(PARTITION BY bikeid ORDER BY start_time ASC) prev_start_time
       FROM `bigquery-public-data.austin_bikeshare.bikeshare_trips` 
     ) 
ORDER BY bikeid, start_time 

我正在使用公共 BigQuery 数据集 bigquery-public-data.austin_bikeshare.bikeshare_trips,我的结果很奇怪,因为它没有显示任何自行车 ID(我已经预计很多空值 (0) 作为 date_diff,因为数据库注册时间戳,有时这辆自行车一天租了很多次)。

    | Linha | bikeid | Tempo | OrderCount |
    |   1   |  null  | null  |     1      |
    |   2   |  null  |  57   |     2      |
    |   3   |  null  |  1    |     3      |

【问题讨论】:

  • 您是否只想知道给定自行车的平均租用分钟数是多少?
  • @khan 我想找到每辆自行车的自行车租赁之间的时间差分布,之后,我想找到每辆自行车的分布的中位数。但我也想学习如何构建这个分布。
  • 检查中位数和其他指标:stackoverflow.com/questions/51981353/…

标签: sql database statistics google-bigquery


【解决方案1】:

bikeid 列中有很多空值。您看到的是空值,因为 ASC 订单将首先获取空值。 您可以选择的选项很少 • 您可以在bikeid 上将您的order by 条款更改为DESC 选择自行车, DATE_DIFF(date(start_time), date(prev_start_time), day) AS Tempo, 订单数 从(选择自行车, 开始时间, ROW_NUMBER() OVER(PARTITION BY bikeid ORDER BY start_time ASC) OrderCount, LAG(start_time) OVER(PARTITION BY bikeid ORDER BY start_time ASC) prev_start_time 发件人bigquery-public-data.austin_bikeshare.bikeshare_trips
)
ORDER BY bikeid desc, start_time • 您可以通过添加 where 子句“where bikeid is not null”来删除 null bikeid 选择自行车, DATE_DIFF(date(start_time), date(prev_start_time), day) AS Tempo, 订单数 从(选择自行车, 开始时间, ROW_NUMBER() OVER(PARTITION BY bikeid ORDER BY start_time ASC) OrderCount, LAG(start_time) OVER(PARTITION BY bikeid ORDER BY start_time ASC) prev_start_time FROM bigquery-public-data.austin_bikeshare.bikeshare_trips
bikeid 不为空的地方 )
ORDER BY OrderCount desc、bikeid desc、start_time

【讨论】:

  • 谢谢!有效!您知道如何仅获取每个自行车分布的中位数吗?
【解决方案2】:

平均值是总差额除以出租次数减一。所以,你不需要窗口函数:

SELECT bikeid,
       DATE_DIFF(MAX(DATE(start_time)), MIN(DATE(start_time)), day) / NULLIF(COUNT(*) - 1, 0) as avg_period
FROM `bigquery-public-data.austin_bikeshare.bikeshare_trips` 
GROUP BY bikeid ;

以上解决了您的疑问并回答了您的问题。我不太确定它有什么用处,因为自行车每天租用多次(这是公共自行车租赁计划的重点)。

至少,您可以使用更小的时间单位:

SELECT bikeid,
       TIMESTAMP_DIFF(MAX(start_time), MIN(start_time), second) / NULLIF(COUNT(*) - 1, 0) as avg_period_in_seconds
FROM  `bigquery-public-data.austin_bikeshare.bikeshare_trips` 
GROUP BY bikeid ;

【讨论】:

  • 实际上,我不需要平均值,我需要中位数。让我编辑帖子!不过谢谢!
  • @LeandroEleutério 。 . .编辑帖子会很粗鲁,因为它会使这个答案无效。这回答了您提出的问题。如果您还有其他问题,请提出一个问题,其中包含示例数据和所需结果。
  • 非常感谢您的回答,但请注意,在我的原始帖子中,我没有提到计算平均值或类似的东西。我说我想计算每辆自行车租用之间的时间差。我只是编辑帖子以更清楚地说明我不想要平均我想要自行车租金之间的天数差异分布。中位数是一个非常好的数据信息,我展示了将我们的数据分成两组的数字,前 50% 和后 50%。在这种情况下,由于时间戳,我不会有用,但正如我所说,我练习了带有日期的寄存器。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-10-21
  • 2018-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-26
  • 1970-01-01
相关资源
最近更新 更多