db2 选择具有最小值的行

r7xajy2e  于 2022-11-07  发布在  DB2
关注(0)|答案(1)|浏览(264)

我正在努力完成一个查询,在这个查询中,我只需要获取那些在特定字段中具有“最小值”的行。这不太符合我对使用MIN()的理解,我希望有人能给我指出正确的方向。
我有一个联接两个表并按sort_order对结果值进行排序的查询。

CREATE TEMPORARY TABLE_TEMP_1
(
   RU_LVL      VARCHAR(3) NOT NULL,
   SORT_ORDER  SMALLINT NOT NULL
);

INSERT INTO TABLE_TEMP_1 (RU_LVL, SORT_ORDER) VALUES ('50', 1);
INSERT INTO TABLE_TEMP_1 (RU_LVL, SORT_ORDER) VALUES ('60', 2);
INSERT INTO TABLE_TEMP_1 (RU_LVL, SORT_ORDER) VALUES ('70', 3);
INSERT INTO TABLE_TEMP_1 (RU_LVL, SORT_ORDER) VALUES ('40', 4);
INSERT INTO TABLE_TEMP_1 (RU_LVL, SORT_ORDER) VALUES ('35', 5);

SELECT *
FROM R_EXPORT_RU R_EXPORT_RU
INNER JOIN TABLE_TEMP_1 TT ON TT.RU_LVL = R_EXPORT_RU.RU_LVL_ID
WHERE PER_ID = 12345
ORDER BY TT.SORT_ORDER;

您可以从该查询中看到,我正尝试为字符字段RU_LVL引入自定义排序顺序。
这个查询可以很好地将所有数据放在一起,并且按SORT_ORDER正确排序。但是,我实际上只想获取SORT_ORDER值最小的行。对于某些人,该值可能是1,而对于其他人,该值可能是4。
我最初的想法是对数据进行排序,然后获取第一行,但不幸的是,在R_EXPORT_RU表中有几行共享相同的RU_LVL_ID值。因此,有可能获得具有相同最小排序顺序的多行,如下所示:

+----------------------------------------------------+
| PER_ID | RU_DESC | RU_LVL_ID | RU_LVL | SORT_ORDER |
+----------------------------------------------------+
| 12345  | Foo     | 40        | 40     | 4          |
| 12345  | Bar     | 40        | 40     | 4          |
| 12345  | Baz     | 35        | 35     | 5          |
+----------------------------------------------------+

在本例中,我想要最上面的两行。不幸的是,我事先不知道SORT_ORDER中的最小值是多少,也不知道有多少行可能与该最小值匹配。因此,我很难知道如何使用MIN()FETCH FIRST函数来限制结果。
谁能给我指个方向?
谢谢你!

wtzytmuj

wtzytmuj1#

我不熟悉DB2,但我在大约4分钟前刚刚回答了一个类似的问题,所以这对我来说很容易复制/粘贴。
使用SQL Generator时,我发现建议使用QUALIFY,但我认为这在DB2中不起作用。
若要在不使用QUALIFY的情况下执行此操作,您可以尝试执行以下操作:

SELECT *
FROM (
    SELECT *,
    ROW_NUMBER() OVER (PARTITION BY PER_ID, RU_LVL_ID ORDER BY SORT_ORDER ASC) AS RN
    FROM table
    ) AS T
WHERE T.RN = 1;

对于支持QUALIFY的RDBMS,

SELECT 
  * 
FROM 
  table QUALIFY ROW_NUMBER() OVER (
    PARTITION BY PER_ID, RU_LVL_ID 
    ORDER BY SORT_ORDER ASC
  ) = 1

相关问题