在SQL Server 2008中按用户名选择最新记录组
我有一个包含以下数据的表格:在SQL Server 2008中按用户名选择最新记录组,sql,sql-server-2008,tsql,Sql,Sql Server 2008,Tsql,我有一个包含以下数据的表格: ID voting_ID username timestamp XMLBallot 1 9 voter01 23. 4. 2012 8:54:45 xmldata 2 9 voter01 21. 4. 2012 14:00:34 xmldata 3 9 voter02 20. 4. 2012 16:01:10 xmlda
ID voting_ID username timestamp XMLBallot
1 9 voter01 23. 4. 2012 8:54:45 xmldata
2 9 voter01 21. 4. 2012 14:00:34 xmldata
3 9 voter02 20. 4. 2012 16:01:10 xmldata
4 11 voter01 23. 4. 2012 8:40:45 xmldata
5 9 voter03 19. 4. 2012 21:18:49 xmldata
我只需要为特定投票ID中的每个投票人用户名获取一张最新选票
例如,我需要返回@voting_ID=9的数据
请帮助我构建SQL Server 2008查询。。非常感谢。
PS:表名为ballots您在此处有几个选项,但通过添加按用户分组并按时间戳降序排序的行号,可以轻松选择最新记录 使用行号 或者,您可以选择每个用户的最大时间戳,并加入该时间戳 使用最大值
这里有几个选项,但通过添加按用户分组并按时间戳降序排序的行号,可以轻松选择最新记录 使用行号 或者,您可以选择每个用户的最大时间戳,并加入该时间戳 使用最大值
也许是这样的: 测试数据 质疑 编辑1 也许是这样的:
DECLARE @voting_ID INT=9
;WITH CTE
AS
(
SELECT
ROW_NUMBER() OVER(PARTITION BY username ORDER BY timestamp DESC) AS RowNbr,
t.*
FROM
@T AS t
WHERE
t.voting_ID=@voting_ID
)
SELECT
*
FROM
CTE
WHERE
RowNbr=1
也许是这样的: 测试数据 质疑 编辑1 也许是这样的:
DECLARE @voting_ID INT=9
;WITH CTE
AS
(
SELECT
ROW_NUMBER() OVER(PARTITION BY username ORDER BY timestamp DESC) AS RowNbr,
t.*
FROM
@T AS t
WHERE
t.voting_ID=@voting_ID
)
SELECT
*
FROM
CTE
WHERE
RowNbr=1
另一种方法
WITH sub
AS (SELECT *,
Max(timestamp) OVER (partition BY company) AS latest
FROM ballots)
SELECT *
FROM sub
WHERE latest = timestamp
另一种方法
WITH sub
AS (SELECT *,
Max(timestamp) OVER (partition BY company) AS latest
FROM ballots)
SELECT *
FROM sub
WHERE latest = timestamp
您的备选解决方案的内部联接中似乎缺少GROUP BY。@AZZSHAIKH-thx,感谢您发现。。。今天是星期一,我能说什么呢。谢谢你,但这对其他投票人不起作用。。此仅选择投票\u ID=9。。当我尝试通过投票选择记录时_ID=11 f.ex。nothing returns..@Gondy-这将返回投票人的最新记录,而不是投票ID。我已更改答案,将投票ID包括在内。谢谢。。将WHERE子句更新为WHERE rn=1和bt.voting_ID=@votingID后,在第一个备选方案中,它最终会起作用。您的备选方案的内部联接中似乎缺少GROUP BY。@AzizShaikh-thx,感谢您发现。。。今天是星期一,我能说什么呢。谢谢你,但这对其他投票人不起作用。。此仅选择投票\u ID=9。。当我尝试通过投票选择记录时_ID=11 f.ex。nothing returns..@Gondy-这将返回投票人的最新记录,而不是投票ID。我已更改答案,将投票ID包括在内。谢谢。。在第一个备选方案中将WHERE子句更新为WHERE rn=1和bt.voting_ID=@votingID之后,它最终会起作用。我可以在哪里传递voting_ID参数?我只需要从特定的投票中选择选票vote@Gondy-您可以将其添加到where子句中,成为where RowNbr=1和voting_ID=@voting_ID谢谢,但不适用于我。。返回的不是最新的时间戳,@votingID=11不返回任何行:我可以在哪里传递投票\u ID参数?我只需要从特定的投票中选择选票vote@Gondy-您可以将其添加到where子句中,成为where RowNbr=1和voting_ID=@voting_ID谢谢,但不适用于我。。返回的不是最新的时间戳,@votingID=11不返回任何行:
DECLARE @voting_ID INT=9
;WITH CTE
AS
(
SELECT
ROW_NUMBER() OVER(PARTITION BY username ORDER BY voting_ID) AS RowNbr,
t.*
FROM
@T AS t
)
SELECT
*
FROM
CTE
WHERE
RowNbr=1
AND CTE.voting_ID=@voting_ID
DECLARE @voting_ID INT=9
;WITH CTE
AS
(
SELECT
ROW_NUMBER() OVER(PARTITION BY username ORDER BY timestamp DESC) AS RowNbr,
t.*
FROM
@T AS t
WHERE
t.voting_ID=@voting_ID
)
SELECT
*
FROM
CTE
WHERE
RowNbr=1
select t1_4.ID, t1_4.voting_id, t1_4.timestamp, t1_4.xmlballot
from table1 as t1_4
where t1_4.ID in ( SELECT id_to_select
from ( SELECT ( SELECT t1_1.ID
from table1 as t1_1
where t1_1.id = ( SELECT top 1 t1_2.ID
from table1 as t1_2
where t1_2.username = t1_3.username
order by timestamp desc)
) as id_to_select,
t1_3.username
from table1 as t1_3
group by username)
)
WITH sub
AS (SELECT *,
Max(timestamp) OVER (partition BY company) AS latest
FROM ballots)
SELECT *
FROM sub
WHERE latest = timestamp