sql - 分组并将多行合并为一行

标签 sql postgresql group-by

我有一张这样的 table :

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 组包含一个带有“确定”的操作,我只想保留这一行

否则如果集合不包含 Action ok,我需要保留具有最大日期的行

我尝试了很多东西,但我无法得到我所期望的,

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

最佳答案

您可以尝试使用ROW_NUMBER 窗口函数。

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

Results :

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

关于sql - 分组并将多行合并为一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53091913/

相关文章:

mysql - 使用left join从mysql的四个表中获取用户在页面上的所有事件

mysql - 从具有多个子查询/联接的 Select 语句创建 View

MySQL::从逗号分隔的字符串中选择

mysql - 如何统计 group by 返回的组数?

mysql - 更新具有相同 id 的多行

java - 无法再次将日期设置为空

macos - 安装后无法连接到 Mac OS X 上的 Postgresql

postgresql - 获取将被级联截断的表列表

c# - NpGsql Entity Framework 6 - "An operation is already in progress"

mysql - 输出 MySQL 记录列表,按类别分组?