SQL Server分区提供了重复的记录

SQL Server分区提供了重复的记录,sql,sql-server,tsql,Sql,Sql Server,Tsql,我有以下表格: Date | ID | firstname ---------+----+------------ 20161128 | 1 | Adam 20161128 | 2 | Steve 20161128 | 2 | Steve 20161128 | 3 | Aaron 20161129 | 1 | Adam 20161129 | 2 | Steve 20161129 | 2 | Steve

我有以下表格:

Date     | ID | firstname 
---------+----+------------
20161128 | 1  | Adam      
20161128 | 2  | Steve     
20161128 | 2  | Steve     
20161128 | 3  | Aaron     
20161129 | 1  | Adam      
20161129 | 2  | Steve     
20161129 | 2  | Steve     
20161129 | 3  | Aaron     
我想按ID获取某个特定日期的第一行

所以我得到的是:

SELECT *    
FROM tableA   
WHERE Date = 20161128
然而,这给出了所有记录。所以我使用了分区覆盖函数:

SELECT 
    *,
    row_number() over(partition by ID order by Date desc) 
FROM tableA 
WHERE Date = 20161128
在这种情况下,我得到以下结果:

Date     | ID | firstname | rownum
---------+----+-----------+-------
20161129 | 1  | Adam      | 1
20161129 | 1  | Adam      | 2
20161129 | 2  | Steve     | 1
20161129 | 2  | Steve     | 2
20161129 | 2  | Steve     | 3
20161129 | 2  | Steve     | 4
20161129 | 2  | Steve     | 5
20161129 | 2  | Steve     | 6
20161129 | 3  | Aaron     | 1
20161129 | 3  | Aaron     | 2
如您所见,大多数ID出现2次。(ID 2甚至出现6次)。在其他情况下,我会看到一条记录出现10次,即使使用第一个查询时它只有一条记录


你知道为什么会发生这种情况以及如何解决吗?我猜应该是date/where子句,但我不知道这会对结果产生多大影响。

如果要筛选记录,需要
where
子句:

SELECT a.*
FROM (SELECT a.*,
             row_number() over(partition by ID order by Date desc) as seqnum
      FROM tableA a
      WHERE a.Date = '20161128'
    ) a
WHERE seqnum = 1;

这将在每个id号的每个日期返回一行。

如果要筛选记录,则需要一个
WHERE
子句:

SELECT a.*
FROM (SELECT a.*,
             row_number() over(partition by ID order by Date desc) as seqnum
      FROM tableA a
      WHERE a.Date = '20161128'
    ) a
WHERE seqnum = 1;

这将在每个id号的每个日期返回一行。

这将仅显示第一个实例

Select * from
(SELECT *,
rownum=row_number() over(partition by PersonID_EXT order by SnapshotDate desc)
FROM tableA
WHERE Date = 20161128)x where rownum =1

这将仅显示第一个实例

Select * from
(SELECT *,
rownum=row_number() over(partition by PersonID_EXT order by SnapshotDate desc)
FROM tableA
WHERE Date = 20161128)x where rownum =1
你可以替换

SELECT *,

row_number() over(partition by ID order by Date desc)

FROM tableA

WHERE Date = 20161128

你可以替换

SELECT *,

row_number() over(partition by ID order by Date desc)

FROM tableA

WHERE Date = 20161128


请确保将该行作为列的别名。您将其引用为rownum,但没有将其别名为rownum。您将rownum放置在错误的位置。。。它应该在最后一个右括号之后
。。。描述)作为rownum
@HoneyBadger不是Khris最初拥有它的地方(见他的编辑)。它是
row\u number()rownumber over(按PersonID分区\u下一顺序按SnapshotDate desc)
。他最后一次编辑使它可以接受。@scsimon,删除comment@HoneyBadger别担心,伙计。一定要把那一行和那一列别名。您将其引用为rownum,但没有将其别名为rownum。您将rownum放置在错误的位置。。。它应该在最后一个右括号之后
。。。描述)作为rownum
@HoneyBadger不是Khris最初拥有它的地方(见他的编辑)。它是
row\u number()rownumber over(按PersonID分区\u下一顺序按SnapshotDate desc)
。他最后一次编辑使它可以接受。@scsimon,删除comment@HoneyBadger别担心,伙计。你可能想看看。你可能想看看。