sql - 从多列中获取最小值和第二最小值的最简单方法是什么(MIN 函数不起作用)?

标签 sql teradata sql-function

下表来自Teradata数据库

SELECT
  sku.Item_id,
  sku.Item_length,
  sku.Item_width,
  sku.Item_heigth,
FROM  Category_item sku

Item_id | Item_length | Item_width |Item_heigth
-------------------------------------------
104174        8            6           1
9482763       8            8           8
8434610       8            9           1
2109145       54           34          2
567106        41           41          2
2028731       3            4           3

我想要的最终结果是,

 Item_id | Item_length | Item_width |Item_heigth | MinValue | SecondMinVale
    ---------------------------------------------------------------------------
    104174        8            6           1          1            6
    9482763       8            8           8          8            8
    8434610       8            9           1          1            8
    2109145       54           34          2          2            34
    567106        41           41          2          2            41
    2028731       3            4           3          3            3

所以我在网上做了一些研究,其中大多数使用带有子查询的 MIN 函数或按分区原始处理。 Min 函数对我不起作用,因为我有三个独立的列。我想从以上三列中获得最小值或至少两个值。

我尝试使用 Least 函数执行子查询或 CTE,但我无法获得第二小的值。我不确定如何为此使用原始分区。

任何有关此的帮助将不胜感激。

非常感谢!

最佳答案

如果没有基于集合的分析函数,您的要求就很困难。我可能会建议取消透视您的数据:

WITH cte AS (
    SELECT Item_id, Item_length AS item FROM Category_item UNION ALL
    SELECT Item_id, Item_width FROM Category_item UNION ALL
    SELECT Item_id, Item_height FROM Category_item
),
cte2 AS (
    SELECT Item_id, item,
        ROW_NUMBER() OVER (PARTITION BY Item_id ORDER BY item) rn
    FROM cte
)

SELECT
    t1.Item_id,
    t1.Item_length,
    t1.Item_width,
    t1.Item_height,
    MAX(CASE WHEN rn = 1 THEN t2.item END) AS MinValue,
    MAX(CASE WHEN rn = 2 THEN t2.item END) AS SecondMinValue
FROM Category_item t1
INNER JOIN cte2 t2
    ON t1.Item_id = t2.Item_id
WHERE
    t2.rn <= 2
GROUP BY
    t1.Item_id,
    t1.Item_length,
    t1.Item_width,
    t1.Item_height;

请注意,使用此类逆透视操作的需要可能严重意味着您的表格应该重新设计,将每个项目的各种测量结果跨而不是跨列存储。

关于sql - 从多列中获取最小值和第二最小值的最简单方法是什么(MIN 函数不起作用)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60200552/

相关文章:

mysql - 如何运行 mySQL 函数来更新所有行?

sql-server - 如何创建一个始终返回传递给其 WHERE 子句的值的表(或其他对象),如镜像

sql - 在 postgres 的第一个表上左连接预过滤

python - 与其他 Teradata 查询方式相比,Teradata REST API 性能如何?

java - 查询teradata以获取所有数据库的列表

foreign-keys - Teradata:如何从表中删除外键约束?

python - 如何在 SQL 中使用 'in' 和 'not in' 过滤 Pandas 数据帧

sql - 获取雪花数据仓库中插入的行的标识

sql - 选择 WHERE 日期 = 天

sql - Oracle:多对多:需要两个外键约束?