3个字段的关系
Relationship of 3 fields
我有 2 个 table:
Table:患者更新
Table: 文本大师
我需要最终结果:
最终结果是某医院变性手术科所有患者的当前状态,但患者姓名的标题是从TextMaster中选取的table。
由此SQL:
SELECT DISTINCT "PatientID",
FIRST_VALUE("TextSource")
OVER (PARTITION BY "PatientID" ORDER BY CASE WHEN "TextSource" IS NOT NULL THEN "EffectiveDate" END DESC) "TextSource",
FIRST_VALUE("TextGroup")
OVER (PARTITION BY "PatientID" ORDER BY CASE WHEN "TextGroup" IS NOT NULL THEN "EffectiveDate" END DESC) "TextGroup",
FIRST_VALUE("TextIndex")
OVER (PARTITION BY "PatientID" ORDER BY CASE WHEN "TextIndex" IS NOT NULL THEN "EffectiveDate" END DESC) "TextIndex",
FIRST_VALUE("FirstName")
OVER (PARTITION BY "PatientID" ORDER BY CASE WHEN "FirstName" IS NOT NULL THEN "EffectiveDate" END DESC) "FirstName",
FIRST_VALUE("LastName")
OVER (PARTITION BY "PatientID" ORDER BY CASE WHEN "LastName" IS NOT NULL THEN "EffectiveDate" END DESC) "LastName"
FROM "PatientsUpdates";
我得到了这样的查询结果:
你能教我正确的 SQL 将 TextSource、TextGroup 和 TextIndex 替换为 TextDetail 或比上面显示的更好 SQL 吗?
如果 TextXXX
是 "TextMaster"
的外键的一部分,那么对于单个行,它们要么全部为空,要么一起填充。在这种情况下,您可以简单地从 left join
到 "TextMaster"
来获取信息。
SELECT DISTINCT pu."PatientID",
FIRST_VALUE(tm."TextDetail")
OVER (PARTITION BY pu."PatientID" ORDER BY CASE WHEN "TextDetail" IS NOT NULL THEN "EffectiveDate" END DESC) "TextDetail",
FIRST_VALUE(pu."FirstName")
OVER (PARTITION BY pu."PatientID" ORDER BY CASE WHEN pu."FirstName" IS NOT NULL THEN "EffectiveDate" END DESC) "FirstName",
FIRST_VALUE(pu."LastName")
OVER (PARTITION BY pu."PatientID" ORDER BY CASE WHEN pu."LastName" IS NOT NULL THEN "EffectiveDate" END DESC) "LastName"
FROM "PatientsUpdates" pu
left join "TextMaster" tm
using ("TextSource", "TextGroup", "TextIndex");
我使用 LEFT JOIN
而不是 INNER JOIN
因为您的问题中缺少信息什么可以为 null 或不为 null 以及在什么组合中,以避免意外删除提供的行必要的信息。但是,如果 "TextSource"
、"TextGroup"
和 "TextIndex"
总是被填充,或者当 "FirstName"
and/or "LastName"
也被填充时总是被填充,那么你可以请改用 INNER JOIN
。
我有 2 个 table:
Table:患者更新
Table: 文本大师
我需要最终结果:
最终结果是某医院变性手术科所有患者的当前状态,但患者姓名的标题是从TextMaster中选取的table。
由此SQL:
SELECT DISTINCT "PatientID",
FIRST_VALUE("TextSource")
OVER (PARTITION BY "PatientID" ORDER BY CASE WHEN "TextSource" IS NOT NULL THEN "EffectiveDate" END DESC) "TextSource",
FIRST_VALUE("TextGroup")
OVER (PARTITION BY "PatientID" ORDER BY CASE WHEN "TextGroup" IS NOT NULL THEN "EffectiveDate" END DESC) "TextGroup",
FIRST_VALUE("TextIndex")
OVER (PARTITION BY "PatientID" ORDER BY CASE WHEN "TextIndex" IS NOT NULL THEN "EffectiveDate" END DESC) "TextIndex",
FIRST_VALUE("FirstName")
OVER (PARTITION BY "PatientID" ORDER BY CASE WHEN "FirstName" IS NOT NULL THEN "EffectiveDate" END DESC) "FirstName",
FIRST_VALUE("LastName")
OVER (PARTITION BY "PatientID" ORDER BY CASE WHEN "LastName" IS NOT NULL THEN "EffectiveDate" END DESC) "LastName"
FROM "PatientsUpdates";
我得到了这样的查询结果:
你能教我正确的 SQL 将 TextSource、TextGroup 和 TextIndex 替换为 TextDetail 或比上面显示的更好 SQL 吗?
如果 TextXXX
是 "TextMaster"
的外键的一部分,那么对于单个行,它们要么全部为空,要么一起填充。在这种情况下,您可以简单地从 left join
到 "TextMaster"
来获取信息。
SELECT DISTINCT pu."PatientID",
FIRST_VALUE(tm."TextDetail")
OVER (PARTITION BY pu."PatientID" ORDER BY CASE WHEN "TextDetail" IS NOT NULL THEN "EffectiveDate" END DESC) "TextDetail",
FIRST_VALUE(pu."FirstName")
OVER (PARTITION BY pu."PatientID" ORDER BY CASE WHEN pu."FirstName" IS NOT NULL THEN "EffectiveDate" END DESC) "FirstName",
FIRST_VALUE(pu."LastName")
OVER (PARTITION BY pu."PatientID" ORDER BY CASE WHEN pu."LastName" IS NOT NULL THEN "EffectiveDate" END DESC) "LastName"
FROM "PatientsUpdates" pu
left join "TextMaster" tm
using ("TextSource", "TextGroup", "TextIndex");
我使用 LEFT JOIN
而不是 INNER JOIN
因为您的问题中缺少信息什么可以为 null 或不为 null 以及在什么组合中,以避免意外删除提供的行必要的信息。但是,如果 "TextSource"
、"TextGroup"
和 "TextIndex"
总是被填充,或者当 "FirstName"
and/or "LastName"
也被填充时总是被填充,那么你可以请改用 INNER JOIN
。