如何获取用户在公共交通数据中的转移时间?

问题描述 投票:-1回答:1

我有公共交通用户的数据。我想找到用户的转移时间。我的数据是这样的;

---Media--------------Time

10010101   ---  2019-01-01 19:38

10010101   ---  2019-01-01 21:38

25757858   ---  2019-01-02 08:30

25757858   ---  2019-01-02 12:00

我想这样做;

---Media--------------1.Time--------------------2.Time ---------Minus Time

10010101   ---  2019-01-01 19:38  ---   2019-01-01 21:38   ------   02:00

25757858   ---  2019-01-02 08:30  ---   2019-01-02 12:00   ------   03:30

我能怎么做?

sql-server database
1个回答
0
投票

试试这个:

    Declare @tab table(media bigint,[Time] datetime)

    insert into @tab
    SELECT 10010101,'2019-01-01 19:38' Union All
    SELECT 10010101,'2019-01-01 21:38' Union All
    SELECT 25757858,'2019-01-02 08:30' Union All
    SELECT 25757858,'2019-01-02 12:00'

    ;with cte
    As
    (
        Select media,[Time] as [1.Time],Lead([Time]) over(Partition by media order by [Time] desc) as [2.Time]
        from @tab
    )

    Select *,
    CONVERT(varchar, DATEDIFF(n, [2.Time],[1.Time])/60) + ':' 
    + RIGHT('0' + CONVERT(varchar, (DATEDIFF(n, [2.Time],[1.Time])%60)), 2) As [Minus Time]
    from cte where [2.Time] is not NULL

如果每个媒体的行数超过2行,并且如果要获取第一个和最后一个条目之间的时间差(按时间顺序),请尝试以下查询:

        Declare @tab table(media bigint,[Time] datetime)

        insert into @tab
        SELECT 10010101,'2019-01-01 19:38' Union All
        SELECT 10010101,'2019-01-01 20:00' Union All
        SELECT 10010101,'2019-01-01 21:38' Union All
        SELECT 25757858,'2019-01-02 08:30' Union All
        SELECT 25757858,'2019-01-02 12:00'


        ;with cte1
        As
        (
            Select *,
            row_number() over (partition by media order by [Time] asc) as seqnum_asc,
            row_number() over (partition by media order by [Time] desc) as seqnum_desc
            From @tab
        )

        ,cte
        As
        (
            Select media,Lead([Time]) over(Partition by media order by [Time] desc) as [1.Time],[Time] as [2.Time]
            from cte1 where seqnum_asc = 1 or seqnum_desc = 1   
        )

        Select *,
        CONVERT(varchar, DATEDIFF(n, [1.Time],[2.Time])/60) + ':' 
        + RIGHT('0' + CONVERT(varchar, (DATEDIFF(n, [1.Time],[2.Time])%60)), 2) As [Minus Time]
        from cte where [1.Time] is not NULL
© www.soinside.com 2019 - 2024. All rights reserved.