替代Datediff over()?

时间:2018-04-06 20:37:00

标签: sql amazon-redshift

我有这种形式的数据:

user_id   event   started   ended   date
1         started 1         0       3/1/2018
1         ended   0         1       3/2/2018
2         started 1         0       3/5/2018
2         ended   0         1       3/22/2018   
3         started 1         0       3/25/2018  

0/1还有其他事件和列,但它们无关紧要。

我试图让每个用户从开始到结束需要多长时间。

我尝试了datediff(day, case when started=1 then date end, case when ended=1 then date end),但由于它们位于不同的行上,因此无效。除了()之外的某些东西可以起作用,但这显然不是一个有效的功能。

提前致谢!

2 个答案:

答案 0 :(得分:1)

假设您在启动之前无法结束,您只需要MIN& MAX为窗口聚合

@Override
public boolean dispatchKeyEvent(KeyEvent e) {
if (e.getKeyCode() == KeyEvent.KEYCODE_ENTER) {
    Toast.makeText(UITestsActivity.this,
               "YOU CLICKED ENTER KEY",
                Toast.LENGTH_LONG).show();
        return true;
    }
    return super.dispatchKeyEvent(e);
};

使用此功能,您也可以添加任何其他列。

如果一个结果行也可以,则可以进行简单聚合:

select user_id, 
   datediff(day, 
            min(date) over (partition by user_id),
            max(date) over (partition by user_id))
from myTable
where event in ('started', 'ended')

答案 1 :(得分:0)

您可以使用user_id列内部加入表格:

SELECT a.[user_id]
     , a.[date] AS StartDate
     , b.EndDate
     , DATEDIFF(DAY, a.[date], b.EndDate) AS DateDifference
FROM dbo.TableNameHere AS a
    INNER JOIN
    (
        SELECT [user_id]
             , [date] AS EndDate
        FROM dbo.TableNameHere
        WHERE [ended] = 1
    ) AS b
        ON a.[user_id] = b.[user_id] 
WHERE a.[started] = 1

在上面的示例中,除了SELECT之外,您并不需要第一个DateDifference中的任何列,我只是让它们在我的测试中可见。