如何计算同一列但不同类别中的日期之间的差异?

How can I calculate difference between dates in the same column but different categories?

我相信有人会指出这是一个基本的重塑问题,但我想我不擅长谷歌搜索,所以我向 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 也可以。

试试下面

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

另一种选择

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