我有这个查询
WITH summary AS
(
SELECT Msisdn, DateRegistered ,
RANK() OVER (ORDER BY DateRegistered ASC) AS dRank
FROM dbo.SubscriptionsArchive
WHERE MSISDN='123456'
)
SELECT s.msisdn, s.DateRegistered AS firstReg
FROM summary s
WHERE dRank =(SELECT max(dRank) FROM summary )
这显示了与最小Rank对应的第一个streg,我想同时获得与maxRank对应的最后一个reg。我该如何做到这一点?
使用TOP 1
语法交叉连接CTE的第一行和最后一行的解决方案:
WITH summary AS
(
SELECT Msisdn, DateRegistered ,
RANK() OVER (ORDER BY DateRegistered ASC) AS dRank
FROM dbo.SubscriptionsArchive
WHERE MSISDN='123456'
)
SELECT minrow.*, maxrow.*
FROM
(select TOP 1 * from summary order by dRank desc) minrow
CROSS JOIN
(select TOP 1 * from summary order by dRank asc) maxrow ;
WITH summary AS
(
SELECT Msisdn, DateRegistered ,
RANK() OVER (ORDER BY DateRegistered ASC) AS ASCRank,
RANK() OVER (ORDER BY DateRegistered DESC) AS DESCRank
FROM dbo.SubscriptionsArchive
WHERE MSISDN='123456'
)
SELECT s.msisdn,
(CASE WHEN ASCRAnk=1 THEN s.DateRegistered END) AS firstReg,
(CASE WHEN DESCRAnk=1 THEN s.DateRegistered END) AS LASTReg
FROM summary s