每组所需的最大行数

Posted

技术标签:

【中文标题】每组所需的最大行数【英文标题】:Max row required for each group 【发布时间】:2021-11-03 13:00:33 【问题描述】:

有 1 个表,其中所有这些记录都是为 1 名员工维护的。由于此表中还有一个列在此示例中未显示,因此该人对于甚至 1 个工作有多行,即工作 J1 有 2 行,工作 J2 有 3 行,工作 J1 也有 2 行。该人从工作 J1 切换到 J2,然后再次切换到 J1。每当发生切换时如何提取所需的行,因为我必须在工作更改时提取每行的最大值。我在主查询的子查询中使用 group by 来提取行,但是如果这个人在去 J2 之后切换回同一个工作 J1,它就不起作用,因为它将 J1 中的所有工作都放在一个组中,这是不正确的。请帮帮我。

StDt             EdDt           Job      Required_Rows
1-Jan-21      31-Jan-21        J1          N
1-Feb-21      30-Jun-21        J1          Y
1-Jul-21      30-Jul-21        J2          N
1-Aug-21      15-Aug-21        J2          N
16-Aug-21     31-Aug-21        J2          Y
1-Sep-21      1-Nov-21         J1          N
2-Nov-21      31-Dec-21        J1          Y

【问题讨论】:

每个用户都有一张表?那是非常糟糕的数据库设计。考虑改变它。 【参考方案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
);

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

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

其中,对于样本数据:

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

两个输出:

STDT EDDT JOB
2021-07-01 00:00:00 2021-07-31 00:00:00 J1
2021-08-16 00:00:00 2021-08-31 00:00:00 J2
2021-11-01 00:00:00 2021-12-31 00:00:00 J1

db小提琴here

【讨论】:

嘿,谢谢。这真的很好。此外,如果我们想在此表中包含更多列更改,例如如果我们必须在同一个表中存在的同一查询中捕获位置更改,我们如何包含。我目前正在使用您的 LEAD 查询。此外,第二部分是我们是否必须从另一个表中选择更改并在此处显示。请帮忙。非常感谢:) @AlkaOjha 如果你有不同的问题,那么你可以ask another question。您在那里提出了多个问题,它们超出了这个问题的范围,您最好在新问题中提供正确的minimal reproducible example。这可能就像在SELECT 子句中包含location 列一样简单(和/或首先JOINing 另一个表),但是如果没有您的数据示例,很难回答。 嘿,谢谢,我已经按照您的建议提出了另一个问题。如果您知道答案,请参阅我提出的“记录中的最大值”问题。非常感谢。 对不起,标题已更改为“仅选择属性更改的行”...。如果您知道该怎么做,请帮助。 嘿,在这组数据中,如果有工作没有变化的数据会发生什么,在这种情况下我如何拉最大行。我们有两种类型的数据,其中某些员工的工作发生了变化,您建议的解决方案有效,但如果没有变化,我需要选择这些行中的最大值。

以上是关于每组所需的最大行数的主要内容,如果未能解决你的问题,请参考以下文章

sql SQL中每组的第一个/最小/最大行数

从相关表中获取每组的最大行数

SQL 帮助,获取所需的输出

虚拟存储

sql 怎么分组取行数最大的一条

我没有从代码中获得所需的输出,while 循环似乎有问题