枢轴如何用于 select 特定票证 ID 的前三个所有者

How pivot is used to select first three owners of a particular ticketid

   ticketid owner   owndate
    1001    LEWIS   2004-06-18 14:15:11.000
    1001    WILSON  2004-06-18 14:16:54.000
    1001    WILSON  2004-06-18 14:21:12.000
    1001    NULL    2004-09-01 09:56:11.000
    1001    CALDONE 2005-02-02 08:38:28.000
    1001    SINCLAIR    2005-02-02 08:54:02.000
    1002    NULL    2005-02-02 08:40:06.000
    1002    WILSON  2004-06-18 14:33:47.000
    1002    NULL    2004-08-31 15:12:46.000
    1002    NULL    2004-09-24 10:03:09.000
    1003    RAMSDALE    2004-09-24 10:04:24.000
    1003    MOTIKA  2004-08-31 14:51:45.000
    1003    NULL    2004-08-31 15:05:50.000
1003    MURTHY  2004-09-02 14:50:28.000
1004    NULL    2004-08-31 15:28:37.000
1004    NULL    2004-09-24 09:24:21.000
1005    WILSON  2004-09-02 16:29:43.000

输出应该是

ticketid owner1 owner2  owner3
1001    NULL    NULL    NULL
1002    NULL    NULL    NULL
1003    NULL    NULL    NULL
1004    NULL    NULL    NULL
1005    NULL    NULL    NULL
1006    NULL    NULL    NULL
1007    NULL    NULL    NULL
1008    NULL    NULL    NULL

而不是 NULL。它应该显示自己日期的差异。即,特定所有者被分配了多长时间的票。我想显示一张特定票的前三位所有者。 请指导。 我计算的时差为:

WITH rows AS
        (
        SELECT  *, ROW_NUMBER() OVER (ORDER BY owndate) AS rn
        FROM    tkownerhistory
        )
SELECT mc.ticketid, mc.owner,mc.owndate
,left('0' + CAST((dATEDIFF(SECOND, mc.owndate, mp.owndate)) / 86400*30 AS VARCHAR),2) + ' months ' +
left('0' + CAST((dATEDIFF(SECOND, mc.owndate, mp.owndate)) / 86400 AS VARCHAR),2) + ' days ' +
left('0' + CAST((dATEDIFF(SECOND, mc.owndate, mp.owndate)) / 3600 AS VARCHAR),2) + ':' +
right('0' + CAST(((dATEDIFF(SECOND, mc.owndate, mp.owndate)) / 60) % 60 AS VARCHAR),2)  + ':' +
right('0' + CAST((dATEDIFF(SECOND, mc.owndate, mp.owndate)) % 60 AS VARCHAR),2)

 as TimeDiffInHours
FROM    rows mc
JOIN    rows mp
ON   mc.rn = mp.rn-1
order by mc.owndate

这显示输出

1001    LEWIS   2004-06-18 14:15:11.000 00 months 00 days 00:01:43
1001    WILSON  2004-06-18 14:16:54.000 00 months 00 days 00:04:18
1001    WILSON  2004-06-18 14:21:12.000 00 months 00 days 00:12:35
1002    WILSON  2004-06-18 14:33:47.000 02 months 07 days 01:13:32
1005    MOTIKA  2004-08-31 14:47:19.000 00 months 00 days 00:04:26
1003    MOTIKA  2004-08-31 14:51:45.000 00 months 00 days 00:14:05
1003    NULL    2004-08-31 15:05:50.000 00 months 00 days 00:06:56
1002    NULL    2004-08-31 15:12:46.000 00 months 00 days 00:15:51

但我不确定如何旋转它,并且只有特定票证 ID 的前三个所有者被选为列,数据将为 "timediffinhours"

假设 i) 您只需要为 3 个所有者进行数据透视。

ii) 我在第二个展示了datediff,你可以像上面那样轻松地将它们转换成disered格式。

也告诉我,问题出在哪里,

    Declare @tkownerhistory table(ticketid int, [owner] varchar(50),owndate datetime)
      insert into @tkownerhistory values(1001,'LEWIS','2004-06-18 14:15:11.000'),
        (1001,'WILSON','2004-06-18 14:16:54.000'),
        (1001,'WILSON','2004-06-18 14:21:12.000'),
        (1001,NULL ,'2004-09-01 09:56:11.000'),
        (1001,'CALDONE','2005-02-02 08:38:28.000'),
        (1001,'SINCLAIR','2005-02-02 08:54:02.000'),
        (1002,NULL ,'2005-02-02 08:40:06.000'),
        (1002,'WILSON','2004-06-18 14:33:47.000'),
        (1002,    NULL,'2004-08-31 15:12:46.000'),
        (1002,    NULL,'2004-09-24 10:03:09.000'),
        (1003,'RAMSDALE','2004-09-24 10:04:24.000'),
        (1003,'MOTIKA','2004-08-31 14:51:45.000'),
        (1003,    NULL,'2004-08-31 15:05:50.000'),
    (1003,    'URTHY','2004-09-02 14:50:28.000'),
    (1004 ,   NULL ,   '2004-08-31 15:28:37.000'),
    (1004 ,   NULL,   '2004-09-24 09:24:21.000'),
    (1005,    'WILSON','2004-09-02 16:29:43.000')

    ;With CTE as
(
SELECT  *, ROW_NUMBER() OVER (partition by ticketid ORDER BY ticketid,owndate ) AS rn
        --,datediff(day,owndate,lead(owndate,1)over(order by owndate))dtdiff
        FROM    @tkownerhistory  

)
,CTE1 as
(
select * 
from cte 
where rn<=4
)
--select * from cte1
select  a.ticketid
        ,datediff(second,a.owndate,b.owndate)[owner1]
            ,datediff(second,b.owndate,c.owndate)[owner2]
    ,datediff(second,c.owndate,d.owndate)[owner3]
from 
cte1 A 
outer apply(select * from cte1 where ticketid=a.ticketid and rn=2)b
outer apply(select * from cte1 where ticketid=a.ticketid and rn=3)c
outer apply(select * from cte1 where ticketid=a.ticketid and rn=4)d
where a.rn=1