【问题标题】:Select only rows where an attribute changes仅选择属性更改的行
【发布时间】:2021-12-17 23:49:34
【问题描述】:

有 1 个表,其中所有这些记录都是为 1 名员工维护的。由于此表中还有一个列在此示例中未显示,因此该人对于甚至 1 个工作有多行,即工作 J1 有 2 行,工作 J2 有 3 行,工作 J1 再有 2 行,顺序和位置相同.该人从工作 J1 切换到 J2,然后再次切换到 J1,并且位置发生相同的变化。每当发生切换时如何提取所需的行,因为当工作或位置发生更改时,我必须提取每行的最大值。请帮帮我。

StDt             EdDt           Job      Location Required_Rows
01-Jan-21      31-Jan-21        J1         L1          N
01-Feb-21      30-Jun-21        J1         L1          Y
01-Jul-21      30-Jul-21        J2         L1          Y
01-Aug-21      15-Aug-21        J2         L2          N 
16-Aug-21      31-Aug-21        J2         L2          Y
01-Sep-21      01-Nov-21        J1         L2          Y
02-Nov-21      31-Dec-21        J1         L1          Y

发布此更改我还需要添加另一个表中的更改,我将从上表中的位置连接到此位置表,并且需要捕获同一位置内的更改。 例如:

StDt             EdDt           Job      Location      (Column in Loc Table : Status)        Required_Rows
01-Jan-21      15-Jan-21        J1         L1                    A                             Y
16-Jan-21      31-Jan-21        J1         L1                    B                             N
01-Feb-21      30-Jun-21        J1         L1                    B                             Y
01-Jul-21      30-Jul-21        J2         L1                    B                             Y
01-Aug-21      15-Aug-21        J2         L2                    B                             N 
16-Aug-21      31-Aug-21        J2         L2                    B                             Y
01-Sep-21      01-Nov-21        J1         L2                    B                             Y
02-Nov-21      31-Dec-21        J1         L1                    B                             Y

编辑:(发布此更改我还需要从另一个表中添加更改,我将从上表中存在的位置加入此位置表,并且需要捕获同一位置内的更改。)

请回复第二张表的答案,我如何在 1 个查询中提取数据以查找位于主表位置的同一位置内的更改。

大家好,

第二个表格如下所示:

 StDt             EdDt        Status       Location 

01-Jan-21      15-Jan-21        A          L1  
   
16-Jan-21      31-Dec-21        B          L1  
   
01-Jan-21      31-Dec-21        B          L2       

【问题讨论】:

  • 请描述2021-01-15 是如何出现在输出中的?样本数据中没有这样的日期
  • 嘿,这不是输出......这是两个不同的数据集......Required_Rows 列告诉输出中应该是什么行,那些是 Y.... 我需要一个两个数据集的解决方案。
  • 那么这个样本数据的输出应该是什么?
  • Required_Rows 列为 Y 的行应该是所有列的数据的输出。
  • 所以我给出了 2 个数据集,因为我需要两个数据集的解决方案......仅在这些数据集中我通过指定 Required_Rows 列指定了我需要在这些数据集中的哪些行作为我的输出为 Y。Required_Rows 为 N 的行在输出中不需要。

标签: sql oracle gaps-and-islands


【解决方案1】:

从 Oracle 12 开始,您可以使用MATCH_RECOGNIZE

SELECT *
FROM   table_name
MATCH_RECOGNIZE(
  ORDER BY stDt
  ALL ROWS PER MATCH
  PATTERN ({- same* -} same )
  DEFINE
    same AS FIRST(job) = job AND FIRST(location) = location
)

对于早期版本,您可以使用LEAD 解析函数:

SELECT StDt,
       EdDt,
       Job,
       location
FROM   (
  SELECT t.*,
         LEAD(job) OVER (ORDER BY StDt) AS next_job,
         LEAD(location) OVER (ORDER BY StDt) AS next_location
  FROM   table_name t
)
WHERE  next_job IS NULL
OR     next_job != job
OR     next_location IS NULL
OR     next_location != location;

其中,对于样本数据:

CREATE TABLE table_name (StDt, EdDt, Job, Location) AS
SELECT DATE '2021-01-01', DATE '2021-01-31', 'J1', 'L1' FROM DUAL UNION ALL
SELECT DATE '2021-02-01', DATE '2021-06-30', 'J1', 'L1' FROM DUAL UNION ALL
SELECT DATE '2021-07-01', DATE '2021-07-31', 'J2', 'L1' FROM DUAL UNION ALL
SELECT DATE '2021-08-01', DATE '2021-08-15', 'J2', 'L2' FROM DUAL UNION ALL
SELECT DATE '2021-08-16', DATE '2021-08-31', 'J2', 'L2' FROM DUAL UNION ALL
SELECT DATE '2021-09-01', DATE '2021-11-01', 'J1', 'L2' FROM DUAL UNION ALL
SELECT DATE '2021-11-01', DATE '2021-12-31', 'J1', 'L1' FROM DUAL

两个输出:

STDT EDDT JOB LOCATION
2021-02-01 00:00:00 2021-06-30 00:00:00 J1 L1
2021-07-01 00:00:00 2021-07-31 00:00:00 J2 L1
2021-08-16 00:00:00 2021-08-31 00:00:00 J2 L2
2021-09-01 00:00:00 2021-11-01 00:00:00 J1 L2
2021-11-01 00:00:00 2021-12-31 00:00:00 J1 L1

db小提琴here


发布此更改我还需要添加另一个表中的更改,我将从上表中存在的 location_id 加入此位置表,并且需要捕获 1 个位置内的更改。

关于另一个表的结构或如何连接这两个表的信息不足,无法回答这部分问题。

【讨论】:

  • 你好,我已经添加了第二张表的数据,它会是什么样子。请帮忙。谢谢你的回复。我正在使用引导功能。
猜你喜欢
  • 2021-04-23
  • 1970-01-01
  • 1970-01-01
  • 2020-12-10
  • 1970-01-01
  • 2018-08-09
  • 2020-12-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多