与其他列中的最小值关联的非空值

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

【讨论】:

以上是关于与其他列中的最小值关联的非空值的主要内容,如果未能解决你的问题,请参考以下文章

11汇总和分组数据

Postgresql 在“id”列中抛出空值违反了 GenerationType.IDENTITY 的非空约束

SQL将多行中的字段的空值填充为先前的非空值

Kotlin 中的非空值产生空指针异常

如何使用 LINQ 将空值发送到 ASP.NET 中的非空列

“last_login”列中的空值违反非空约束