查询以查找 SQL 查询中上一行的更改
Posted
技术标签:
【中文标题】查询以查找 SQL 查询中上一行的更改【英文标题】:Query to find changes in a row wrt previous row in SQL query 【发布时间】:2018-12-26 10:05:38 【问题描述】:我有一个表 per_all_Assignments_f
与 date_from
和 date_to
以及以下列结构:
PERSON_ID DATE_FROM DATE_TO GRADE
--------- ------------ ----------- -----
12 01-Jan-2018 28-Feb-2018 c
12 01-Mar-2018 29-Mar-2018 a
12 30-Mar-2018 31-dec-4712 b
13 01-jan-2018 31-dec-4712 c
在上表中,我必须检索最新的成绩变化,即对于person_id
'12'
,我必须检索两个记录行:30-mar-2018
到 31 dec 4712
是最新的和之前的一行。我可以为此使用什么功能?
已解决:
SELECT person_id,
asg.grade_id,
lag(asg.grade_id) Over (Partition By person_ID Order By start_date) as prev_ppg_line1,
lag(start_date) Over (Partition By person_ID Order By start_date)
as prev_ppg_effective_start_date,
start_date,
row_Number() Over (Partition By person_ID Order By effective_start_date) as rn
FROM asg_table asg
WHERE person_id = 12;
此查询将获取包含所有先前更改的 3 行。我只想获取最新的更改,而不使用 max on Effective start date
【问题讨论】:
你的意思是 select person_id , date_From , date_to , grade from per_all_Assignments_f order by date_From date_to desc no moudiz 我的意思是如果成绩发生了变化,那么最新的行和前 1 行。所以对于上面的例子....第 2 行和第 3 行应该为第 12 人返回。因为从 3 月 30 日到现在,成绩已经从 a 变为 b 【参考方案1】:您可以在子查询中同时使用row_number
和lead
分析函数:
select person_id, date_From, date_to, grade
from
(
with per_all_Assignments_f(person_id, date_From, date_to, grade) as
(
select 12,date'2018-01-01',date'2018-02-28','c' from dual union all
select 12,date'2018-03-01',date'2018-03-29','a' from dual union all
select 12,date'2018-03-30',date'4172-12-31','b' from dual union all
select 13,date'2018-01-01',date'4172-12-31','c' from dual
)
select t.*,
lead(grade) over (order by date_From desc) as ld,
row_number() over (order by date_From desc) as rn
from per_all_Assignments_f t
)
where rn <= 2
and grade != ld
order by rn desc;
PERSON_ID DATE_FROM DATE_TO GRADE
---------- ----------- ---------- -------
12 01.03.2018 29.03.2018 a
12 30.03.2018 31.12.4172 b
Rextester Demo
【讨论】:
谢谢.. 我创建了一个查询来使用延迟解决上述查询。我可以使用什么来获取最新行或最大有效开始日期行? @Sree 。 . .这回答了您提出的问题。如果您还有其他问题,请作为其他问题提出。 @Sree 不客气。很高兴听到我能帮助你。正如 Gordon 指出的那样,很高兴提出另一个问题并准确说明您想要什么。顺便说一句,如果有帮助,请标记答案。 嘿,我已经编辑并添加了我采用的最新相关问题的解决方案【参考方案2】:似乎您只想要 row_number()
的所有内容,按人员划分为 1 或 2,并按开头降序排序。
SELECT person_id,
date_from,
date_to,
grade
FROM (SELECT person_id,
date_from,
date_to,
grade,
row_number() OVER (PARTITION BY person_id
ORDER BY date_from DESC) rn
FROM per_all_assignments_f t) x
WHERE rn IN (1, 2)
ORDER BY person_id ASC,
date_from DESC;
【讨论】:
以上是关于查询以查找 SQL 查询中上一行的更改的主要内容,如果未能解决你的问题,请参考以下文章
sql SQL查询以查找表中的列中的重复项,从而更改列的排序规则以确保重复项检查为大小写