Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/86.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在SQL Server 2008中按用户名选择最新记录组_Sql_Sql Server 2008_Tsql - Fatal编程技术网

在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