我对SQL比较新,但我有一个查询,
select top 3 LoginDateTime from UserLogins where Username = 'John Doe' order by LoginDateTime desc
返回最近的三次登录。
我将如何转动查询,以便最终得到一个结果,其中每个日期都在其自己的列中,列标题为“第一个'”,第二个&#39 ;和' 3'?
谢谢!
ADDENDUM:查询在MS SQL Server上运行,专门针对结果的内容(将来可能会更改,以包含不仅仅是前三个登录)。它甚至可能成为列标题本身必须随时间变化的情况,因此静态标题(与编程生成相反)将是理想的解决方案。
答案 0 :(得分:2)
您必须有一些东西可以转向以确定哪个列应该获得什么值,因此您可以创建row_number然后转动该数据。这是测试数据的一个例子。
DECLARE @UserLogins AS TABLE (LoginDateTime DATETIME, UserName VARCHAR(20))
INSERT INTO @UserLogins (LoginDateTime, UserName)
VALUES
(GETDATE(),'John Doe')
,(GETDATE() -1,'John Doe')
,(GETDATE() -2,'John Doe')
,(GETDATE() -3,'John Doe')
,(GETDATE() -4,'John Doe')
;WITH cteRowNum AS (
SELECT TOP (3)
UserName
,LoginDateTime
,RowNum = ROW_NUMBER() OVER (PARTITION BY 1 ORDER BY LoginDateTime DESC)
FROM
@UserLogins
WHERE
UserName = 'John Doe'
ORDER BY
LoginDateTime DESC
)
SELECT
UserName
,[1] as [1st]
,[2] as [2nd]
,[3] as [3rd]
FROM
cteRowNum
PIVOT (
MAX(LoginDateTime)
FOR RowNum IN ([1],[2],[3])
) p
注意SELECT TOP(3)并且必须按顺序排列我只是将它作为限制器保留在那里。如果登录少于3次,则该计数的列将为空,超过3只不会显示.....