首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >只选择一个副本

只选择一个副本
EN

Database Administration用户
提问于 2016-01-04 13:29:45
回答 3查看 26.7K关注 0票数 3

我有一个定购单和库房结账的数据库,而且似乎库房结帐往往会被重复插入(我们每晚从旧系统中获取这些数据)。从这个表中获取所有行的选择是什么,但一次只能选择一个重复的行?我有大约100000个副本,我的DB还在圣诞假期

这些表确实有唯一的键,但是除了键之外,数据被重复了几千次。我想避免删除数据(以防万一)。服务器正在运行MSSQL2012,当我回到我的办公桌时,我将用表格结构编辑这篇文章。

EN

回答 3

Database Administration用户

回答已采纳

发布于 2016-01-04 15:11:52

如果希望返回的行是完整的完整行,而不是任何其他列的聚合,则可以为此使用CTE。您可以根据任何列更改ORDER BY以选择行(分组由您认为应该是唯一的列组成)。

代码语言:javascript
复制
;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;
票数 10
EN

Database Administration用户

发布于 2016-01-04 13:44:21

Jaco关于使用DISTINCT的建议在很多情况下都是可行的。

如果您需要有关字段的信息,这些字段在“重复项”之间可能会有所不同,那么您可以将相同的项分组,并在其余的字段上使用聚合:

代码语言:javascript
复制
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()),但这会变得更加复杂。如果你能在这个问题上增加一些关于数据的更多细节,我们可以给出更多的具体例子,如果它看起来是相关的。

票数 2
EN

Database Administration用户

发布于 2016-01-04 13:36:12

您可以使用DISTINCT,但要确保省略对两个重复行可能发生变化的任何列,例如时间戳:

代码语言:javascript
复制
SELECT DISTINCT Field1, Field2
FROM dbo.Table

或者,您也可以按作为自然密钥的部分的字段进行分组,例如,订单id或发票号:

代码语言:javascript
复制
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_id
票数 1
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/125133

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档