【发布时间】:2021-07-28 04:23:21
【问题描述】:
我有一个如下所示的表格:
PartNumber Part ValuesList x1 x2 x3 x4
123456 Fender x1 11 10 9 12
123456 Fender x1,x2 11 10 9 12
123456 Fender x2,x4 11 10 9 12
123456 Fender x1,x2,x3,x4 11 10 11 12
123456 Fender x2,x3,x4 11 10 9 12
对于每一行,如何根据 ValuesList 中给出的列名从 x1、x2、x3、x4 列中找到最小值?
例如,第 1 行很简单。 ValuesList 的值为 x1,所以我只需要查看 x1 列,最小值为 11。
第 2 行 .. ValuesList 的值为 x1,x2。我需要 x1 和 x2 列(11 和 10)之间的较小数字。最小值为 10。
第 3 行 .. ValuesList 的值为 x2,x4。我需要列 x2 和 x4(10 和 12)之间的较小数字。最小值为 10。
第 4 行 .. ValuesList 的值为 x1,x2,x3,x4。我需要 x1、x2、x3 和 x4 列(11、10、11、12)之间的较小数字。最低值为 10。
第 5 行 .. ValuesList 的值为 x2、x3、x4。我需要 x2、x3 和 x4 列(10、9、12)之间的较小数字。最低值为 9。
实际的表有数十万行。
在伪代码中,我想要类似的东西
SELECT PartNumber, Part, MIN(ColumnValue) WHERE ColumnName IN (SELECT ColumnNames FROM ValuesList)
在最低数字出现在多列的情况下,最低数字取自哪一列并不重要。
谢谢!
【问题讨论】:
-
理想情况下你应该修复你的设计;在 RDBMS 中存储分隔数据始终是一个缺陷。存储多个具有相同名称的列也是如此,只是递增(在本例中为
x1、x2等)。如果您修复您的设计,这非常很容易。只需几个JOINs 和一个聚合函数。
标签: sql sql-server tsql