Sql 按分组并将多行合并为一行

Sql 按分组并将多行合并为一行,sql,postgresql,group-by,Sql,Postgresql,Group By,我有一张这样的桌子: group subgroup date action A a 09/09/2017 ok A b 17/10/2018 ko A c 17/11/2018 wait A d 21/12/2018 no-action B e

我有一张这样的桌子:

group    subgroup     date           action
A         a           09/09/2017       ok
A         b           17/10/2018       ko
A         c           17/11/2018       wait
A         d           21/12/2018       no-action
B         e           11/12/2020       nok
B         f           13/11/2019       wait
所以对于这个集合,我只想按组得到一行 例如,组A包含一个带有“ok”的动作,我只想保留这一行

否则,如果集合不包含动作ok,我需要将行保留为max of date

我尝试了很多东西但都没能得到我想要的

group           date           action
    A          09/09/2017       ok
    B          11/12/2020       nok

您可以尝试使用
行号
窗口功能

CREATE TABLE T(
   "group" varchar(50),
   subgroup varchar(50),
   "date" date,
   action varchar(50)
);


insert into T values ('A','a','2017/09/09','ok');
insert into T values ('A','b','2018/10/17','ko');
insert into T values ('A','c','2018/11/17','wait');
insert into T values ('A','d','2018/12/21','no-action');
insert into T values ('B','e','2020/12/11','nok');
insert into T values ('B','f','2019/11/13','wait');
查询1

SELECT "group",date,"action" FROM (
    SELECT *,ROW_NUMBER() OVER(PARTITION BY "group" order by case when action = 'ok' then 1 else 2 end,date desc) rn
    FROM T
)t1
where rn = 1
| group |       date | action |
|-------|------------|--------|
|     A | 2017-09-09 |     ok |
|     B | 2020-12-11 |    nok |

SELECT "group",date,"action" FROM (
    SELECT *,ROW_NUMBER() OVER(PARTITION BY "group" order by case when action = 'ok' then 1 else 2 end,date desc) rn
    FROM T
)t1
where rn = 1
| group |       date | action |
|-------|------------|--------|
|     A | 2017-09-09 |     ok |
|     B | 2020-12-11 |    nok |

您可以尝试使用
行号
窗口功能

CREATE TABLE T(
   "group" varchar(50),
   subgroup varchar(50),
   "date" date,
   action varchar(50)
);


insert into T values ('A','a','2017/09/09','ok');
insert into T values ('A','b','2018/10/17','ko');
insert into T values ('A','c','2018/11/17','wait');
insert into T values ('A','d','2018/12/21','no-action');
insert into T values ('B','e','2020/12/11','nok');
insert into T values ('B','f','2019/11/13','wait');
查询1

SELECT "group",date,"action" FROM (
    SELECT *,ROW_NUMBER() OVER(PARTITION BY "group" order by case when action = 'ok' then 1 else 2 end,date desc) rn
    FROM T
)t1
where rn = 1
| group |       date | action |
|-------|------------|--------|
|     A | 2017-09-09 |     ok |
|     B | 2020-12-11 |    nok |

SELECT "group",date,"action" FROM (
    SELECT *,ROW_NUMBER() OVER(PARTITION BY "group" order by case when action = 'ok' then 1 else 2 end,date desc) rn
    FROM T
)t1
where rn = 1
| group |       date | action |
|-------|------------|--------|
|     A | 2017-09-09 |     ok |
|     B | 2020-12-11 |    nok |

您可以通过优先顺序来实现这一点:

select t.*
from (select t.*,
             row_number() over (partition by group 
                                order by case when action = 'ok' then 1 else 2 end,
                                         date
                               ) as seqnum
      from t
     ) t
where seqnum = 1;

您可以通过优先顺序来实现这一点:

select t.*
from (select t.*,
             row_number() over (partition by group 
                                order by case when action = 'ok' then 1 else 2 end,
                                         date
                               ) as seqnum
      from t
     ) t
where seqnum = 1;

请不要标记多个RDBMS,只需选择您正在处理的正确RDBMS。请不要标记多个RDBMS,只需选择您正在处理的正确RDBMS。