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别担心,伙计。你可能想看看。你可能想看看。