SQL Server 是否有一种方法可以使用SQL获取包含多个条件的最新原始记录

r1zk6ea1  于 2022-11-21  发布在  其他
关注(0)|答案(1)|浏览(86)

我 想 获取 表 中 每个 组 的 最 新 数据 和 原始 数据 , 但 有 一 组 条件 。
下面 是 数据 集/表 的 当前 结构 。

  • 每个 组 可以 有 多 个 项目
  • 每个 item _ id 可以 有 相同 的 item _ name , 这些 称为 change item _ names , 但 有 一 个 显著 的 区别 , 即 ( ) 。
  • 每个 item _ id 可以 有 多 个 状态 , 但 在 下面 的 示例 中 , 它 被 简化 为 只有 两 个 状态 : " 草稿 " - 〉 " 已 批准 " 。

| 组 群|日期|项目 标识|项目 名称|状态|标价|股票|
| - -| - -| - -| - -| - -| - -| - -|
| A 级|2022 年 1 月 1 日|36FG - 34 - 45 型 发动 机|异 丙 肾上腺 素|草稿|十五|100 个|
| 乙|2022 年 1 月 2 日|28AE - 23 - 67 年|异 丙 肾上腺 素|已 核准|三十|一百 二十|
| A 级|2022 年 1 月 5 日|1999 年 12 月 45 日|去 甲 肾上腺 素|已 核准|二十 个|三百|
| C 语言|2022 年 1 月 7 日|1988 年 12 月 14 日|异 丙 肾上腺 素|草稿|10 个|五百 个|
| 乙|2022 年 1 月 5 日|45AB - 16 - 77 型 发动 机|CD - 4567 ( 一 种 )|草稿|三十五|二百|
| A 级|2022 年 1 月 3 日|76JJ - 98 - 66 型|苯 并 咪唑|已 核准|五十 个|二百 五十|
| A 级|2022 年 2 月 2 日|17KL - 10 - 43 型|苯 并 咪唑 -1234|草稿|十二|四百|
| C 语言|2022 年 3 月 3 日|97EE - 42 - 17 型 发动 机|阿 司 替 尼|已 核准|二十五 个|四百 五十|
所 需 输出 :采用 每个 组 的 最 新 item _ id & 当 涉及 更改 流程 且 状态 不 等于 " 批准 " 时 , 则 采用 每个 组 已 批准 的 最 新 item _ id 。
还要 注意 的 是 , 它 不 一定 是 每个 组 中 第 二 个 最近 获得 批准 的 记录 , 可以 在 时间 表 和 流程 中 更 早 地 进行 。
| 组 群|日期|项目 标识|项目 名称|状态|标价|股票|原始 项目 标识|原始 项目 名称|原始 状态|原价|原始 库存|
| - -| - -| - -| - -| - -| - -| - -| - -| - -| - -| - -| - -|
| A 级|2022 年 2 月 2 日|17KL - 10 - 43 型|苯 并 咪唑 -1234|草稿|十二|四百|76JJ - 98 - 66 型|苯 并 咪唑|已 核准|五十 个|二百 五十|
| 乙|2022 年 1 月 5 日|28AE - 23 - 67 年|CD - 4567 ( 一 种 )|草稿|三十五|二百|45AB - 16 - 77 型 发动 机|异 丙 肾上腺 素|已 核准|三十|一百 二十|
| C 语言|2022 年 3 月 3 日|97EE - 42 - 17 型 发动 机|阿 司 替 尼|已 核准|二十五 个|四百 五十|空 值|空 值|空 值|空 值|空 值|

dxxyhpgq

dxxyhpgq1#

组A的示例输出显示原始项目名称(该组中已批准的最新项目名称)为DE-1234(1)。其日期为1/3/2022,但项目名称DE-1234的日期为1/5/2022,这使其成为组A中已批准的最新项目标识。因此,对于该参考,我的输出与您的不同。
这里有一个到SQL Fiddle的链接,我在那里重新创建了这个。
下面是我为此创建的查询:
首先,我们创建一个CTE,按组对项目进行排序,以获取每组的最新信息。

WITH cte AS--rank records by group ordered by date DESC
(
   SELECT
    [group]
    ,[date]
    ,item_id
    ,item_name
    ,status
    ,price
    ,stock
    ,ROW_NUMBER() OVER (PARTITION BY [group] ORDER BY [date] DESC) AS rn
  FROM t
 )

然后,我们将CTE过滤为仅批准的CTE,并重新排序以获得最近批准的组。

,cte2 AS--rank joined records where status = approved by group ordered by date DESC
 (
  SELECT
    a.[group]
    ,a.[date]
    ,a.item_id
    ,a.item_name
    ,a.status
    ,a.price
    ,a.stock
    ,b.[group] AS original_group
    ,b.[date] AS original_date
    ,b.item_id AS original_item_id
    ,b.item_name AS original_item_name
    ,b.status AS original_status
    ,b.price AS original_price
    ,b.stock AS original_stock
   ,ROW_NUMBER() OVER (PARTITION BY a.[group] ORDER BY b.rn) rn--get most recent record that was approved
  FROM cte a
  LEFT JOIN cte b ON
    a.[group] = b.[group]
    AND b.rn > a.rn--b is a previous record
    AND b.status = 'Approved'
  WHERE a.rn = 1--Most recent item id
)

最后,我们查询cte 2筛选,仅查找最近批准的记录

SELECT
    [group]
    ,[date]
    ,item_id
    ,item_name
    ,status
    ,price
    ,stock
    --,original_group
    --,original_date
    ,original_item_id
    ,original_item_name
    ,original_status
    ,original_price
    ,original_stock
FROM cte2
WHERE rn = 1--filter for most recent record that was approved

相关问题