sql - SQL select 语句返回一组事件在同一 ID 上多次发生的记录
问题描述
假设我有一张桌子:
CREATE TABLE births
(
childid INT,
momid INT,
eclampsia VARCHAR(1),
preeclampsia VARCHAR(1),
hypertension VARCHAR(1)
);
插入记录:
INSERT INTO BIRTHS (CHILDID, MOMID, ECLAMPSIA)
VALUES (654321, 123456, 'Y'),
(654321, 123456, 'Y'),
INSERT INTO BIRTHS (CHILDID, MOMID, HYPERTENSION)
VALUES (987652, 465468, 'Y'),
(987987, 465468, 'Y')
INSERT INTO BIRTHS (CHILDID, MOMID)
VALUES (687765, 465468)
INSERT INTO BIRTHS (CHILDID, MOMID, PREECLAMPSIA)
VALUES (649870, 846587, 'Y')
INSERT INTO BIRTHS (CHILDID, MOMID)
VALUES (787463, 846587);
我想返回所有生育过不止一个孩子并且在不止一次怀孕中出现这三种诊断之一的母亲的记录。
我的预期结果是:
child momid eclampsia preeclampsia hypertension
-------------------------------------------------------------
654321 123456 Y
431265 123456 Y
987652 465468 Y
987987 465468 Y
我该怎么写这个?
我有一个草率的查询,不能完全满足我的要求。它在一定程度上起作用,但仍然给我记录,妈妈只对一次怀孕进行了诊断。
select distinct
a.*, b.eclampsia, b.preeclampsia, b.hypertension
from
births a
join
births b on a.momid = b.momid
where
a.childid != b.childid
and a.eclampsia = 'y'
and (b.eclampsia = 'y' or b.preeclampsia = 'y' or b.hypertension = 'y')
or a.preeclampsia = 'y'
and (b.preeclampsia = 'y' or b.eclampsia = 'Y' or b.hypertension = 'y')
or a.hypertension = 'y'
and (b.hypertension = 'y' or b.eclampsia = 'y' or b.preeclampsia = 'y')
order by
mapersonid
解决方案
这是一种方法。它计算出生表中显示每个母亲的症状之一的记录,使用该计数 > 1 作为显示记录的条件,只要该记录还显示其中一个条件:
SELECT childid, momid,
COALESCE(eclampsia, '') AS eclampsia,
COALESCE(preeclampsia, '') AS preeclampsia,
COALESCE(hypertension, '') AS hypertension
FROM births b1
WHERE (SELECT COUNT(*) FROM births b2 WHERE b2.momid = b1.momid AND
(ECLAMPSIA = 'Y' OR PREECLAMPSIA = 'Y' OR HYPERTENSION = 'Y')
GROUP BY momid) > 1 AND
(ECLAMPSIA = 'Y' OR PREECLAMPSIA = 'Y' OR HYPERTENSION = 'Y')
输出
child momid eclampsia preeclampsia hypertension
654321 123456 Y
431265 123456 Y
987652 465468 Y
987987 465468 Y
推荐阅读
- php - 将自定义标头参数传递给 Knp SnappyBundle
- sql - 合并sql条件为空问题
- c# - SignalR 如何接收自定义数据类型?
- java - 如何通过按 Chrome 下的相同链接重新加载页面并开始下载?在 FF 下运行良好
- azure - 尝试从 Azure 表中删除实体时,Azure Logic App 给出 404
- r - R中的strptime函数返回空值
- reactjs - 为 react 应用设置 nginx 代理
- docker - fabcar 示例:致命错误:运行时执行期间出现意外信号 [信号 SIGSEGV:分段违规代码=0x1 addr=0x63 pc=0x7f84bc4ea259]
- linux - linux仅合并来自多个文件的行子集
- mysql - 基于if条件的第二个表中的R sum列