【问题标题】:Omit Duplicate Only When In Sequential Order仅在按顺序时省略重复
【发布时间】:2017-02-01 19:45:43
【问题描述】:

我有一个查询返回以下信息。我使用 Over(PARTITION BY 来包含行号。每次我的 work_center_S 开始新订单#时我都会捕获,但是当 part_number 与之前的订单/行相同时,我想排除新订单的开始. 我无法使用 DISTINCT 函数,因为 part_number 可能一天会出现很多次,每次发生这种变化时我都需要捕获。

[![查询返回][1]][1] [1]:https://i.stack.imgur.com/IKvsR.jpg

+----+--------+---------------+-------------+------+
| rn | Order# | work_center_S | part_number | Hour |
+----+--------+---------------+-------------+------+
| 1  | 7098   | TB312         | 37203       | 1    |
+----+--------+---------------+-------------+------+
| 2  | 8797   | TB312         | 37194       | 4    |
+----+--------+---------------+-------------+------+
| 3  | 8802   | TB312         | 37355       | 11   |
+----+--------+---------------+-------------+------+
| 4  | 0946   | TB312         | 37194       | 15   |
+----+--------+---------------+-------------+------+
| 5  | 0698   | TB312         | 37203       | 18   |
+----+--------+---------------+-------------+------+
| 6  | 0699   | TB312         | 37203       | 21   |
+----+--------+---------------+-------------+------+

【问题讨论】:

  • 请始终指定您使用的 SQL Server 版本。例如,LAG/LEAD 可能会派上用场,但如果您使用的是 SQL Server 2000(我们必须猜测),则不会。
  • 我使用的是 SQL Server 2016。我仍在试图弄清楚如何让 stackoverflow 正确显示我的返回结果。如果显示我的查询结果,则不应显示 rn 6,因为虽然 rn 5 和 rn 6 具有不同的 Order#,但两个 Order# 都用于相同的 part_number。就业务规则而言,这样做的原因是,某些 work_center_S 可能只生成一个 part_number,但它们不能无限期地运行一个 Order#。但 part_number 的变化是我需要捕捉的重要事件。
  • 好吧,我认为这不应该是用于显示简单表格结果的代码 sn-p。见advanced help for the editor

标签: sql sql-server tsql sql-server-2016


【解决方案1】:

我假设没有-1 part_number

select  Order#,work_center_S,part_number,Hour

from   (select  *
               ,lag(part_number,1,-1) over
                (
                    partition by  work_center_S
                    order by      Hour
                ) as prev_part_number

        from    mytable
        ) t

where   part_number <> prev_part_number

--

+--------+---------------+-------------+------+
| Order# | work_center_S | part_number | Hour |
+--------+---------------+-------------+------+
| 7098   | TB312         | 37203       | 1    |
+--------+---------------+-------------+------+
| 8797   | TB312         | 37194       | 4    |
+--------+---------------+-------------+------+
| 8802   | TB312         | 37355       | 11   |
+--------+---------------+-------------+------+
| 946    | TB312         | 37194       | 15   |
+--------+---------------+-------------+------+
| 698    | TB312         | 37203       | 18   |
+--------+---------------+-------------+------+

【讨论】:

  • 小时可能会结束,也许rm 列是订购的更好选择,但这是 OP 必须知道的。
  • @dlatikay,对,但 rn 是由 OP 为这篇文章生成的。 rn OVER 子句应该用于 LAG 函数
猜你喜欢
  • 2018-08-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-12
  • 2022-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多