2016-12-17 92 views
2

我相信有人会指出这是一个基本的重塑问题,但我猜我在Google上很穷,所以我提出了我的问题,直到Stack Overflow的神。如何计算同一列中不同类别的日期之间的差异?

我的问题是,我想计算来自同一列但在另一列(Rank)中具有不同值的两个日期(等级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 

理想情况下,我想这样做的画面,但SQL/BigQuery是OK了。

+0

难道一个用户曾经有超过一排的多个具有相同的等级?你完全忽略了第3名?或者你还想要3至2级的日子吗?在你的例子中,排名似乎只是日期的相反顺序。情况总是如此吗? –

+0

对于Tableau解决方案,我可能会使用表格计算。取决于上述问题的答案。 –

回答

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

+0

这个伎俩!谢谢,米哈伊尔! – dnaeye

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, 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 
相关问题