0

我面临以下问题:在一个 SQL 表中,我存储了有关人员、日期和疾病的信息。

CREATE TABLE Diseases (person varchar(80), time date, disease varchar(80))

INSERT INTO Diseases (person, time, disease) VALUES ('Harry', '2018-03-06', 'A30')
INSERT INTO Diseases (person, time, disease) VALUES ('Harry', '2017-04-06', 'C27')
INSERT INTO Diseases (person, time, disease) VALUES ('Harry', '2016-08-12', 'Z07')
INSERT INTO Diseases (person, time, disease) VALUES ('Harry', '2016-08-12', 'C27')
INSERT INTO Diseases (person, time, disease) VALUES ('Ruth', '2018-08-12', 'B02')
INSERT INTO Diseases (person, time, disease) VALUES ('Ruth', '2018-08-12', 'C02')

现在我想将每个人的疾病代码汇总到一个变量中:

SELECT Diseases.person, 
STRING_AGG(Diseases.disease, ',') AS Diags, 
Diseases.time
FROM Diseases
GROUP BY Diseases.person, Diseases.time

我如何设法仅汇总在当前病例之前和同一日期识别的那些疾病(例如,Harry 应该在 2017 年病例的行中有 Z07 和 C27)?

我想获得一个包含名称、日期和包含汇总疾病列表的变量的表格。我如何管理只包括疾病的不同价值?

我尝试了以下但它不起作用:

SELECT 
    today.person, 
    today.time, 
    today.disease, 
    STRING_AGG(DISTINCT past.DISEASE, ',') AS disease_history
FROM diseases today
LEFT JOIN diseases past 
    ON past.person = today.person AND past.time <= today.time
GROUP BY today.person, today.time, today.disease

4

1 回答 1

1

该要求并不完全清楚,留有解释的余地​​。还是让我来回答一下,我想你问了什么。

您可以使用子句轻松增强您的选择语句,where以仅聚合特定日期之前的疾病。

SELECT Diseases.person, 
STRING_AGG(Diseases.disease, ',') AS Diags, 
Diseases.time
FROM Diseases
WHERE Diseases.time < '2018-08-12'
GROUP BY Diseases.person, Diseases.time

但是,我怀疑,这不是你想要的。请注意,您使用该group by子句,这意味着您从查询中检索的记录通常比在基表中检索的记录少。

我的猜测是您想要检索相同数量的记录,但是对于每个单独的案例,请查看您之前见过的汇总疾病,并包括(正如您在下面的评论中所表达的那样)各自的日期。如果是这种情况,您可以通过自加入来解决此问题diseases

SELECT 
    today.person, 
    today.time, 
    today.disease, 
    STRING_AGG(past.DISEASE, ',') AS disease_history
FROM diseases today
LEFT JOIN diseases past 
    ON past.person = today.person AND past.time <= today.time
GROUP BY today.person, today.time, today.disease

请注意,在这种情况下, left joinandjoin会产生相同的结果,因为现在每个记录都与其自己的记录相连。

第二次查询的结果集

在另一条评论中,您表达了消除历史疾病重复条目的要求。这必须在将 join 输入 function 之前完成STRING_AGG。最简单的方法可能是使用子选择通过聚合或distinct子句消除这些重复项:

SELECT 
    person, 
    time, 
    disease, 
    STRING_AGG(past_disease, ',') as disease_history
FROM
(
    SELECT DISTINCT
        today.person, 
        today.time, 
        today.disease, 
        past.disease as past_disease 
    FROM diseases today
    LEFT JOIN diseases past 
        ON past.person = today.person AND past.time <= today.time
)
GROUP BY person, time, disease
ORDER BY person, time

结果,您会发现历史疾病,包括当前发生的疾病,并删除了重复项:

在此处输入图像描述

于 2022-01-20T08:13:15.717 回答