首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >替代Datediff over()?

替代Datediff over()?
EN

Stack Overflow用户
提问于 2018-04-06 20:37:00
回答 2查看 577关注 0票数 1

我有这份表格的资料:

代码语言:javascript
复制
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),但是由于它们位于不同的行,所以不能工作。类似于datediff over()的东西可以工作,但这显然不是一个有效的函数。

提前感谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-04-06 21:03:43

假设您不能在开始之前结束,您只需要MIN & MAX作为窗口的集合。

代码语言:javascript
复制
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')

使用它,您也可以添加任何其他列。

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

代码语言:javascript
复制
select user_id,
   min(date) as started, 
   max(date) as ended,
   datediff(day, 
            min(date),
            max(date)) as duration
from myTable
where event in ('started', 'ended')
group by user_id
票数 1
EN

Stack Overflow用户

发布于 2018-04-06 20:55:44

您可以使用user_id列内部连接表本身:

代码语言:javascript
复制
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中的任何列,我只是在测试中为可见性提供了它们。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49700666

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档