当特定的列组合确定其重复性时,如何排除sql中的数据?

Posted

技术标签:

【中文标题】当特定的列组合确定其重复性时,如何排除sql中的数据?【英文标题】:How to exclude data in sql when a particular combination of columns determine its duplicativeness? 【发布时间】:2019-12-11 11:08:09 【问题描述】:

据我所知,我有一个数据集是正确的。如下所示。

enter image description here

    QuoteStatus Quoteid batchID EffDate Iteration   Months  Revenue
1   Block Ready 275576  900265  3/1/2019    1      1096     635791
2   Block Ready 275654  900265  3/1/2019    1      1096     635791
3   Sold        275654  900265  3/1/2019    2      1096     635791

但是,我有一个要求,当某些列组合在一起时,每条记录必须是唯一的。

从结果集中——我认为这是一条重复记录,因为 QuoteStatus = ‘Block Ready’ 和 Iteration = ‘1’ 的组合重复了不止一次。 (即使 QuoteID 是不同的) 我不希望第 1 行出现,我不能简单地从 Select 语句中删除“QuoteID”,因为我希望它显示。

我已尝试将 ROW_NUMBER ( ) OVER ( PARTITION BY QuoteId Order by QuoteID ) 作为 ROW_Partition。但是结果不是我想要的。我不能排除 ROW_Partition = '1' 因为那仍然会留下第 2 行。

    QuoteStatus Quoteid batchID EffDate Iteration   ROW_Partition   Months  Revenue
1   Block Ready 275576  900265  3/1/2019    1           1           1096    635791
2   Block Ready 275576  900265  3/1/2019    1           2           1096    635791
3   Block Ready 275576  900265  3/1/2019    1           3           1096    635791
4   Block Ready 275576  900265  3/1/2019    1           4           1096    635791
5   Block Ready 275654  900265  3/1/2019    1           1           1096    635791
6   Block Ready 275654  900265  3/1/2019    1           2           1096    635791
7   Block Ready 275654  900265  3/1/2019    1           3           1096    635791
8   Block Ready 275654  900265  3/1/2019    1           4           1096    635791
9   Sold        275654  900265  3/1/2019    2           5           1096    635791
10  Sold        275654  900265  3/1/2019    2           6           1096    635791
11  Sold        275654  900265  3/1/2019    2           7           1096    635791
12  Sold        275654  900265  3/1/2019    2           8           1096    635791

我想在不明确排除 QuoteID = ‘275576​​’ 的情况下删除第 1 行,因为这可能发生在许多其他 Quotes 上。

【问题讨论】:

请将 SQL 和数据作为格式化文本包含在您的问题中,因为这将有助于我们弄清楚发生了什么。 以文本(而非图像)的形式发布示例数据和预期结果,并更好地解释您想要应用的条件。 【参考方案1】:

我认为您想根据要区分的列计算行号,请记住,要过滤 ROW_NUMBER,您需要将其包装在子查询或 CTE (SQL Row_Number() function in Where Clause) 中:

ROW_NUMBER() OVER (PARTITION BY QuoteStatus, Iteration ORDER BY QuoteID) as seqnum

然后您可以过滤此值。

【讨论】:

嗨@Gordon Linoff 愚蠢的问题在这里......我可以使用'seqnum'过滤掉同一查询中的结果吗?谢谢。 @i.am.satishv 。 . .您需要一个子查询或 CTE。 感谢您的帮助,我现在将关闭此帖子。看起来使用 ROW_NUMBER() 是可行的方法,但是如果不使用 Quoteid 作为过滤器,我无法排除 Quote Status = 'Block Ready' 和 QuoteID = '275576​​' 的 4 条记录。

以上是关于当特定的列组合确定其重复性时,如何排除sql中的数据?的主要内容,如果未能解决你的问题,请参考以下文章

仅当特定文件集发生更改时如何触发构建

如何在特定列之后添加 SQL 中的列?

当 SQL Server 表中的列“createdDate”从现在起经过 90 天后,如何更新其具有数百万行的列?我们可以使用触发器吗?

sql 2008 查询排除 某一列的数据

如何在 SQL SERVER 的列中列出所有可能的组合?

如何使编译器仅搜索包含目录中的特定文件并排除该特定目录中的其余文件[重复]