使用SQL查找多列行中的最小值

Posted

技术标签:

【中文标题】使用SQL查找多列行中的最小值【英文标题】:Finding Minimum value in row of multiple columns using SQL 【发布时间】:2021-11-16 22:00:33 【问题描述】:

我正在尝试从 6 列值中找出一个 ID(行)的最小值。我首先必须从具有字符串值(如“部分完成”)、空值、缺失字符串的表中进行查询,这些字符串我设置为与该步骤的序列(step1、step2、step3.step4、step5、step6)匹配的数值。否则我将其设置为零,并且在计算最小值时我不关心零。

所以我认为我可以使用 case 语句来计算最小值,但我并没有得到一致的结果。以下是我的代码,所以如果有更好的解决方案或我需要做的更改,请告诉我。先感谢您!抱歉我的格式不正确

Select pt.PROJECT_NUMBER, pt.STEP1, pt.STEP2, pt.STEP3, pt.STEP4, pt.STEP5, pt.STEP6,
CASE WHEN STEP1 = 'PARTIAL COMPLETE' OR STEP1 IS NULL OR STEP1 = '' THEN 1 ELSE 0 END AS step1_val,
CASE WHEN STEP2 = 'PARTIAL COMPLETE' OR STEP2 IS NULL OR STEP2 = '' THEN 2 ELSE 0 END AS step2_val,
CASE WHEN STEP3 = 'PARTIAL COMPLETE' OR STEP3 IS NULL OR STEP3 = '' THEN 3 ELSE 0 END AS step3_val,
CASE WHEN STEP4 = 'PARTIAL COMPLETE' OR STEP4 IS NULL OR STEP4 = '' THEN 4 ELSE 0 END AS step4_val,
CASE WHEN STEP5 = 'PARTIAL COMPLETE' OR STEP5 IS NULL OR STEP5 = '' THEN 5 ELSE 0 END AS step5_val,
CASE WHEN STEP6 = 'PARTIAL COMPLETE' OR STEP6 IS NULL OR STEP6 = '' THEN 6 ELSE 0 END AS step6_val


INTO #Temp

FROM
ProjectTracker.GIS.PROJECT_TRACKING pt 
WHERE PROJECT_RECEIVED = 'YES' AND PROJECT_NUMBER = '5797'


SELECT * FROM #Temp


Select PROJECT_NUMBER,
        Case When step1_val < step2_val And step1_val < step3_val And step1_val < step4_val And step1_val < step5_val And step1_val < step6_val Then step1_val
            When step2_val < step1_val And step2_val < step3_val And step2_val < step4_val And step2_val < step5_val And step2_val < step6_val Then step2_val
            When step3_val < step1_val And step3_val < step2_val And step3_val < step4_val And step3_val < step5_val And step3_val < step6_val Then step3_val
            When step4_val < step1_val And step4_val < step2_val And step4_val < step3_val And step4_val < step5_val And step4_val < step6_val Then step4_val
            When step5_val < step1_val And step5_val < step2_val And step5_val < step3_val And step5_val  < step4_val And step5_val < step6_val Then step5_val
            Else step6_val
            End As TheMin
From   #Temp

Drop Table #Temp

这会产生图像中的结果,显然预期的结果应该是 5 所以我不确定我哪里出错了

【问题讨论】:

这个桌子设计简直就是一场噩梦。如果你将来还有一步会发生什么?你必须重新设计所有。请仔细阅读这篇文章en.wikipedia.org/wiki/Database_normalization 并在为时已晚之前重新设计您的数据库;) @Claus- 感谢您的客气话。我问了一个非常基本的问题,并希望得到一些帮助,而不是关于我在 sql 方面有多糟糕的讲座。不过谢谢你 【参考方案1】:

这似乎有效:

Select pt.PROJECT_NUMBER, pt.STEP1, pt.STEP2, pt.STEP3, pt.STEP4, pt.STEP5, pt.STEP6,

当 STEP1 = '部分完成' 或 STEP1 为 NULL 或 STEP1 = '' THEN 1 ELSE NULL END AS step1_val 时的情况, 当 STEP2 = '部分完成' 或 STEP2 为 NULL 或 STEP2 = '' THEN 2 ELSE NULL END AS step2_val 时的情况, 当 STEP3 = '部分完成' 或 STEP3 为 NULL 或 STEP3 = '' THEN 3 ELSE NULL END AS step3_val 时的情况, 当 STEP4 = '部分完成' 或 STEP4 为 NULL 或 STEP4 = '' THEN 4 ELSE NULL END AS step4_val 时的情况, 当 STEP5 = '部分完成' 或 STEP5 为 NULL 或 STEP5 = '' THEN 5 ELSE NULL END AS step5_val 时的情况, 当 STEP6 = 'PARTIAL COMPLETE' 或 STEP6 为 NULL 或 STEP6 = '' THEN 6 ELSE NULL END AS step6_val 时的情况

进入#Temp

来自 ProjectTracker.GIS.PROJECT_TRACKING pt WHERE PROJECT_RECEIVED = 'YES' --AND PROJECT_NUMBER = '11782'

从 #Temp 中选择 *

SELECT PROJECT_NUMBER,MIN(x.a) 从 ( SELECT PROJECT_NUMBER,step1_val a FROM #Temp 联盟 SELECT PROJECT_NUMBER,step2_val a FROM #Temp 联盟 SELECT PROJECT_NUMBER,step3_val a FROM #Temp 联盟 SELECT PROJECT_NUMBER,step4_val a FROM #Temp 联盟 SELECT PROJECT_NUMBER,step5_val a FROM #Temp 联盟 SELECT PROJECT_NUMBER,step6_val a FROM #Temp ) X GROUP BY PROJECT_NUMBER

删除表#Temp

【讨论】:

以上是关于使用SQL查找多列行中的最小值的主要内容,如果未能解决你的问题,请参考以下文章

通过字符串列的最大值和最小值查找数据行中的值是不是相等

Panda DF:在有条件的多列中查找最小值

在 Spark 的 Dataframe 行中查找最小值

从具有多列的 .txt 文件中查找最大值、最小值

在 Excel 中查找具有多种数据类型的行中的最小日期

查找最小数值并返回不同行中的单元格