每组所需的最大行数
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
列一样简单(和/或首先JOIN
ing 另一个表),但是如果没有您的数据示例,很难回答。
嘿,谢谢,我已经按照您的建议提出了另一个问题。如果您知道答案,请参阅我提出的“记录中的最大值”问题。非常感谢。
对不起,标题已更改为“仅选择属性更改的行”...。如果您知道该怎么做,请帮助。
嘿,在这组数据中,如果有工作没有变化的数据会发生什么,在这种情况下我如何拉最大行。我们有两种类型的数据,其中某些员工的工作发生了变化,您建议的解决方案有效,但如果没有变化,我需要选择这些行中的最大值。以上是关于每组所需的最大行数的主要内容,如果未能解决你的问题,请参考以下文章