【发布时间】:2021-07-25 20:56:54
【问题描述】:
基本上我的数据库中有如下所述的数据:
我期待输出如下:
所以我的意思是,如果一个人未通过/通过所有科目,我只需要显示第一行,否则我需要显示该特定人的所有数据。
如果人通过和失败(乔治),我可以显示记录,但如果他在所有科目中失败/通过(对于 Sam 和 John),则无法显示
我尝试通过添加一些子查询和分组并使用 LAG 和 LEAD 函数,但我无法获得结果。你们中的任何人都可以建议这样做吗..
【问题讨论】:
基本上我的数据库中有如下所述的数据:
我期待输出如下:
所以我的意思是,如果一个人未通过/通过所有科目,我只需要显示第一行,否则我需要显示该特定人的所有数据。
如果人通过和失败(乔治),我可以显示记录,但如果他在所有科目中失败/通过(对于 Sam 和 John),则无法显示
我尝试通过添加一些子查询和分组并使用 LAG 和 LEAD 函数,但我无法获得结果。你们中的任何人都可以建议这样做吗..
【问题讨论】:
你可以使用窗口函数:
select t.*
from (select t.*,
count(*) over (partition by name) as cnt,
count(*) over (partition by name, status) as cnt_status,
row_number() over (partition by name order by no) as seqnum
from t
) t
where seqnum = 1 or
cnt <> cnt_status;
你也可以在没有窗口函数的情况下这样做:
select t.*
from t
where exists (select 1
from t t2
where t2.name = t.name and t2.status <> t.status
) or
t.no = (select min(t2.no) from t t2 where t2.name = t.name);
【讨论】: