与其他列中的最小值关联的非空值
Posted
技术标签:
【中文标题】与其他列中的最小值关联的非空值【英文标题】:Non null value associated with least value in other column 【发布时间】:2021-12-24 03:42:07 【问题描述】:我的数据是这样的:
期望的输出:
我尝试过使用以下 SQL:
CASE
WHEN (MINDAY_DIFF > 0) AND (MINDAY_DIFF IS NOT NULL)
THEN FIRST_VALUE(BP_MED) OVER (PARTITION BY ID ORDER BY MINDAY_DIFF ASC)
END AS DRUG
这将返回 NULL。
我也试过
CASE
WHEN (MINDAY_DIFF > 0)
THEN BP_MED
ELSE NULL
END AS DRUG
它返回BP_MED
的两个非空值。
我也试过NVL
,但也没有用。
因为它在 Netezza。网上的解决方案较少。请帮忙。
【问题讨论】:
【参考方案1】:这里的概念是由内而外的:
我们并不总是有分析来让事情变得更容易:所以不知道 Netezza,我采取了一种更...过时的方法。可能有更好/更有效的方法;我会寻找一个可以玩耍的地方;但我认为这适用于大多数 RDBMS,因为我试图避免任何 RDBMS 特定方面,除非我们正在处理支持预左连接的 RDBMS。
在结果集 (MinAndID) 中查找最小 ID 和该 ID 的天差 LEFT 连接回 baseSet 以获取所有可能的值,专门用于获取 BP_Med 然后加入基表以确保我们获得所有记录,然后仅填充链接到 minDay_Diff 的 BP_Med。由于它是左连接,因此每个 ID 只应返回 1 条记录。未经测试:
SELECT A.*, DesiredDrug.BP_MED
FROM TABLE A
LEFT JOIN (SELECT ID, Fill_Date, BP_MED, MinDay_Diff
FROM TABLE BaseSet
INNER JOIN (SELECT MIN(MINDAY_DIFF) MDD, ID
FROM TABLE
WHERE ID is not null
GROUP BY ID) MinAndID
on BaseSet.ID = MinAndID.ID
and BaseSet.MinDay_Diff = MinAndID.MDD) DesiredDrug
on A.ID = DesiredDrug
and A.Fill_Date = DesiredDrug.Fill_Date
and A.BP_Med= DesiredDrug.BP_Med
and A.MinDay_Diff = DesiredDrug.MinDay_Diff
【讨论】:
以上是关于与其他列中的最小值关联的非空值的主要内容,如果未能解决你的问题,请参考以下文章
Postgresql 在“id”列中抛出空值违反了 GenerationType.IDENTITY 的非空约束