postgresql - 连接来自同一列的记录?
问题描述
我写了一个查询,目的如下:在我的“DAT_PAGS”数据集中有四次访问(visname):程序前、程序、程序后、研究结束
如果对于表中的任何这些访问,statusid ='0' 和 statusid ='5' 的记录(即输入或没有数据),我希望页面名称(pagename)出现在我的输出中(见下文)。
我的问题是双重的: - 有没有办法在我的输出中连接每次访问的所有页面名?所以我每个子编号只有一行?
-有一个更好的方法吗?我仍然掌握 SQL 的窍门,所以如果这是一种荒谬的方法,非常感谢您的反馈!
我的查询:
SELECT
DISTINCT "DAT_SUB".SUBNUM as "Subject ID",
nodatapreproc.pagename as "Pre-Procedure",
nodataproc.pagename as "Procedure",
nodatapostproc.pagename as "Post-Procedure",
nodataEOS as "End Of Study"
FROM
"Disco_Radial"."DAT_SUB"
LEFT JOIN (SELECT subnum, visname, pagename, statusid FROM "Disco_Radial"."DAT_PAGS" where
("Disco_Radial"."DAT_PAGS".statusid = '5' AND "DAT_PAGS".visname = 'Post-Procedure')) postprocentered
on "DAT_SUB".subnum = postprocentered.subnum
LEFT JOIN (SELECT subnum, visname, pagename, statusid FROM "Disco_Radial"."DAT_PAGS" where
("Disco_Radial"."DAT_PAGS".statusid = '0' AND "DAT_PAGS".visname = 'Post-Procedure')) nodatapostproc
ON nodatapostproc.subnum = postprocentered.subnum
LEFT JOIN (SELECT subnum, visname, pagename, statusid FROM "Disco_Radial"."DAT_PAGS" where
("Disco_Radial"."DAT_PAGS".statusid = '5' AND "DAT_PAGS".visname = 'Pre-Procedure')) preprocentered
on "DAT_SUB".subnum = preprocentered.subnum
LEFT JOIN (SELECT subnum, visname, pagename, statusid FROM "Disco_Radial"."DAT_PAGS" where
("Disco_Radial"."DAT_PAGS".statusid = '0' AND "DAT_PAGS".visname = 'Pre-Procedure')) nodatapreproc ON
nodatapreproc.subnum = preprocentered.subnum
LEFT JOIN (SELECT subnum, visname, pagename, statusid FROM "Disco_Radial"."DAT_PAGS" where
("Disco_Radial"."DAT_PAGS".statusid = '5' AND "DAT_PAGS".visname = 'Procedure')) procentered on
"DAT_SUB".subnum = procentered.subnum
LEFT JOIN (SELECT subnum, visname, pagename, statusid FROM "Disco_Radial"."DAT_PAGS" where
("Disco_Radial"."DAT_PAGS".statusid = '0' AND "DAT_PAGS".visname = 'Procedure')) nodataproc ON
nodataproc.subnum = procentered.subnum
LEFT JOIN (SELECT subnum, visname, pagename, statusid FROM "Disco_Radial"."DAT_PAGS" where
("Disco_Radial"."DAT_PAGS".statusid = '5' AND "DAT_PAGS".visname = 'End Of Study')) EOSentered on
"DAT_SUB".subnum = EOSentered.subnum
LEFT JOIN (SELECT subnum, visname, pagename, statusid FROM "Disco_Radial"."DAT_PAGS" where
("Disco_Radial"."DAT_PAGS".statusid = '0' AND "DAT_PAGS".visname = 'End Of Study')) nodataEOS ON
nodataEOS.subnum = EOSentered.subnum
ORDER BY "DAT_SUB".subnum;
我的部分输出:
解决方案
我认为您可以通过条件聚合来做到这一点
SELECT ds.subnum as "Subject ID",
string_agg(pagename, ',') filter (where dp.statusid = '0' AND dp.visname = and 'Pre-Procedure') as "Pre-Procedure",
string_agg(pagename, ',') filter (where dp.statusid = '5' AND dp.visname = and 'Pre-Procedure') as "???",
string_agg(pagename, ',') filter (where dp.statusid = '0' AND dp.visname = and 'Procedure') as "Procedure",
string_agg(pagename, ',') filter (where dp.statusid = '0' AND dp.visname = and 'Post-Procedure') as "Post-Procedure",
string_agg(pagename, ',') filter (where dp.statusid = '5' AND dp.visname = and 'Post-Procedure') as "?????",
string_agg(pagename, ',') filter (where dp.statusid = '0' AND dp.visname = and 'End Of Study') as "End Of Study"
FROM "Disco_Radial"."DAT_SUB" ds
LEFT JOIN "Disco_Radial"."DAT_PAGS" dp ON ds.subnum = dp.subnum
GROUP BY ds.subnum;
推荐阅读
- javascript - 在我的标签中将显示从块设置为无
- java - Exoplayer 停止在 Fragment 的 RecyclerView 中不起作用
- postgresql - 当我们在事务中定义保存点时,Postgres 在哪个表中记录保存点名称?
- mysql - MySql 错误 1093 尝试使用两个数据库和两个表进行更新
- azure-sql-database - 存储过程中的文件处理 - Azure SQL 无服务器数据库
- reporting-services - 在 ssrs 报告的每一页上重复多行
- java - 如何在矩形框中制作透明的黑色。(颜色为黑色,但需要透明,需要显示后面的屏幕)
- reactjs - 如何在redux工具包中推送reducer状态的数组值?
- docker - docker swarm macvlan 网络问题
- python-requests - 如何将请求代码转换为scrapy?