【发布时间】:2013-11-18 11:03:52
【问题描述】:
我对具有多个连接的大量大表(行和列)进行了查询,但是其中一个表有一些重复的数据行,导致我的查询出现问题。由于这是来自另一个部门的只读实时提要,我无法修复该数据,但我正在努力防止我的查询出现问题。
鉴于此,我需要将此废话数据作为左联接添加到我的良好查询中。数据集如下:
IDNo FirstName LastName ...
-------------------------------------------
uqx bob smith
abc john willis
ABC john willis
aBc john willis
WTF jeff bridges
sss bill doe
ere sally abby
wtf jeff bridges
...
(大约 2 打列,10 万行)
我的第一直觉是执行一个 distinct 给了我大约 80K 行:
SELECT DISTINCT P.IDNo
FROM people P
但是当我尝试以下操作时,我得到了所有行:
SELECT DISTINCT P.*
FROM people P
或
SELECT
DISTINCT(P.IDNo) AS IDNoUnq
,P.FirstName
,P.LastName
...etc.
FROM people P
然后我想我会在所有列上执行一个 FIRST() 聚合函数,但是这也感觉不对。从语法上讲,我在这里做错了吗?
更新: 只是想注意:这些记录是基于上面列出的 ID 的非键/非索引字段的重复项。 ID 是一个文本字段,虽然具有相同的值,但它与导致问题的其他数据不同。
【问题讨论】:
-
听起来这些行不是真正的重复项。某些列必须不同,否则
distinct *不会返回所有行。你能澄清一下是什么让一行重复吗? -
请为此表提供所需的输出
declare @t table(id int, name char(1)) insert @t values (1, 'a'), (1, 'b'), (1, 'a'), (2, 'a'), (2, 'c') -
您可以使用带有
ROW_NUMBER() OVER (PARTITION BY FirstName, LastName ORDER BY ID/DATE DESC) As orderID的 CTE,然后从 CTE 中选择该列等于 1 的位置。 @acfrancis 是对的;您需要定义输出的主键并将其用于按列分区。 -
@acfrancis 正确,它们是基于上面列出的 ID 的非键/非索引字段的重复项。 ID 是一个文本字段,虽然具有相同的值,但它与其他数据的大小写不同。
-
CTE 不是专有的(例如,在许多 rdbms Oracle、DB2、SQL Server/Sybase、Postgres 中可用)
标签: sql sql-server tsql join greatest-n-per-group