【问题标题】:How can I calculate difference between dates in the same column but different categories?如何计算同一列但不同类别的日期之间的差异?
【发布时间】:2016-12-17 08:42:43
【问题描述】:

我相信有人会指出这是一个基本的重塑问题,但我想我在谷歌搜索方面很差,所以我将我的问题提供给 Stack Overflow 的诸神。

我的问题是我想计算来自同一列但在另一列(排名)中具有不同值的两个日期(排名 1 和 2)之间的天数。这是数据集架构的示例:

User   Date        Rank
Bob    2016-12-01    3
Bob    2016-12-07    2
Bob    2016-12-10    1

我想要的是这样的:

User   Date1        Date2        DaysBetween
Bob    2016-12-07   2016-12-10        3

理想情况下,我想在 Tableau 中执行此操作,但 SQL/BigQuery 也可以。

【问题讨论】:

  • 一个用户是否曾经有不止一行具有相同的排名?你是完全无视3级吗?或者你也想要排名 3 和 2 之间的天数?在您的示例中,排名似乎只是日期的相反顺序。总是这样吗?
  • 对于 Tableau 解决方案,我可能会使用表格计算。取决于以上问题的答案。

标签: sql google-bigquery tableau-api


【解决方案1】:

下面试试

WITH YourTable AS (
  SELECT 'Bob' AS User, DATE '2016-12-01' AS Date, 3 AS Rank UNION ALL
  SELECT 'Bob' AS User, DATE '2016-12-07' AS Date, 2 AS Rank UNION ALL
  SELECT 'Bob' AS User, DATE '2016-12-10' AS Date, 1 AS Rank 
)
SELECT 
  User, 
  MAX(CASE WHEN Rank = 2 THEN Date END) AS Date1,
  MAX(CASE WHEN Rank = 1 THEN Date END) AS Date2,
  DATE_DIFF(MAX(CASE WHEN Rank = 1 THEN Date END), 
            MAX(CASE WHEN Rank = 2 THEN Date END), DAY) AS DaysBetween
FROM YourTable
GROUP BY User

注意 - 这是在 BigQuery Standard SQL

【讨论】:

    【解决方案2】:

    另一种选择

    WITH YourTable AS (
      SELECT 'Bob' AS User, DATE '2016-12-01' AS Date, 3 AS Rank UNION ALL
      SELECT 'Bob' AS User, DATE '2016-12-07' AS Date, 2 AS Rank UNION ALL
      SELECT 'Bob' AS User, DATE '2016-12-10' AS Date, 1 AS Rank 
    )
    SELECT 
      User, Date1, Date2, 
      DATE_DIFF(Date2, Date1, DAY) AS DaysBetween
    FROM (
      SELECT 
        User, Rank, Date as Date2, 
        LEAD(Date) OVER(PARTITION BY User ORDER BY Date DESC) AS Date1
      FROM YourTable
    )
    WHERE Rank = 1
    

    【讨论】:

      猜你喜欢
      • 2019-09-25
      • 1970-01-01
      • 2020-02-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多