【问题标题】:Eliminating Duplicate Values using a row count使用行计数消除重复值
【发布时间】:2018-05-16 10:38:51
【问题描述】:

我使用行数来返回匹配 1 或 2 的值。我需要保持所有值等于 2。但是,根据我正在尝试的列名,一些行数为 1 的值是相同的过滤。我正在寻找的是一种保留计数为 2 的行但仅在行计数为 2 时才排除计数为 1 的行的方法。在下面的示例中,我返回相同的 salesorder ID 为 528886,但想排除该行,因为它有第 2 行。

查询:

select * from (
    select *, ROW_NUMBER() over (partition by SalesOrderPostedID
    Order By SalesOrderPostedID) as RowNumber
    from cte5) c
    Where SalesOrderPostedID=528886
    and c.RowNumber=1
    Union all
    select * from (
    select *, ROW_NUMBER() over (partition by SalesOrderPostedID
    Order By SalesOrderPostedID) as RowNumber
    from cte5) c
    Where SalesOrderPostedID=528886
    and c.RowNumber=2

我已附上结果。


Gorgon 提供的解决方案稍作修改。下面的查询返回计数为一或二的所有行或计数仅为一的任何行。

选择 c.* 从(选择 cte5., row_number() over(按 SalesOrderPostedID 分区 按销售订购OrderPostedID ) 作为行号, count() 超过(按 SalesOrderPostedID 分区)为 cnt 从 cte5 ) C 其中(行号 = 2 或 cnt = 1);

【问题讨论】:

  • 你能提供样本数据和想要的结果吗?我真的无法理解解释。

标签: sql duplicates union common-table-expression


【解决方案1】:

你为什么不这样做?

select c.*
from (select c.*, 
             row_number() over (partition by SalesOrderPostedID
                                Order By SalesOrderPostedID
                               ) as RowNumber
     from cte5
    ) c
where SalesOrderPostedID = 528886 and c.RowNumber <= 2;

如果您只想要成对的行,请使用:

select c.*
from (select c.*, 
             row_number() over (partition by SalesOrderPostedID
                                Order By SalesOrderPostedID
                               ) as RowNumber,
             count(*) over (partition by SalesOrderPostedID) as cnt
     from cte5
    ) c
where SalesOrderPostedID = 528886 and RowNumber <= 2 and
      cnt >= 2;

【讨论】:

  • 感谢您的帮助。这正是我们所需要的。尊敬的
猜你喜欢
  • 2022-11-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-13
  • 2012-07-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-07
相关资源
最近更新 更多