我有一个定购单和库房结账的数据库,而且似乎库房结帐往往会被重复插入(我们每晚从旧系统中获取这些数据)。从这个表中获取所有行的选择是什么,但一次只能选择一个重复的行?我有大约100000个副本,我的DB还在圣诞假期
这些表确实有唯一的键,但是除了键之外,数据被重复了几千次。我想避免删除数据(以防万一)。服务器正在运行MSSQL2012,当我回到我的办公桌时,我将用表格结构编辑这篇文章。
发布于 2016-01-04 15:11:52
如果希望返回的行是完整的完整行,而不是任何其他列的聚合,则可以为此使用CTE。您可以根据任何列更改ORDER BY以选择行(分组由您认为应该是唯一的列组成)。
;WITH x AS
(
SELECT col1, col2, col3,
rn = ROW_NUMBER() OVER
(
PARTITION BY unique_columns
ORDER BY unique_columns, tie_breaker_if_you_care
)
FROM dbo.source_table
)
SELECT col1, col2, col3 FROM x WHERE rn = 1;发布于 2016-01-04 13:44:21
Jaco关于使用DISTINCT的建议在很多情况下都是可行的。
如果您需要有关字段的信息,这些字段在“重复项”之间可能会有所不同,那么您可以将相同的项分组,并在其余的字段上使用聚合:
SELECT field1, field2
, COUNT(*) AS NumberOfCopies
, MIN(some_numeric_or_date_field_that_varies) AS minValue
, MAX(some_numeric_or_date_field_that_varies) AS maxValue
GROUP BY field1, field2如果您需要关于第一个或最后一个副本的特定信息,那么可以尝试使用窗口函数(particularly ROW_NUMBER()),但这会变得更加复杂。如果你能在这个问题上增加一些关于数据的更多细节,我们可以给出更多的具体例子,如果它看起来是相关的。
发布于 2016-01-04 13:36:12
您可以使用DISTINCT,但要确保省略对两个重复行可能发生变化的任何列,例如时间戳:
SELECT DISTINCT Field1, Field2
FROM dbo.Table或者,您也可以按作为自然密钥的部分的字段进行分组,例如,订单id或发票号:
SELECT order_id,
MAX(total_order_value) AS total_order_value,
MAX(number_of_items) AS number_of_items,
MAX(price_per_item) AS price_per_item,
FROM dbo.Table
GROUP BY order_idhttps://dba.stackexchange.com/questions/125133
复制相似问题