如何计算同一列但不同类别中的日期之间的差异?
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
我相信有人会指出这是一个基本的重塑问题,但我想我不擅长谷歌搜索,所以我向 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