如何使用Informix从随机字母组中选择较高的值?

问题描述 投票:1回答:1

我在表中有一栏代表产品的检验类型。

product | status
-----------------
pen     | F
pen     | G
pen     | S
pencil  | A
pencil  | G
erase   | F
erase   | S
erase   | F

在一个过程中,每个检查都以不同的固定步骤进行。但是字母不是按照这些步骤排序的。他们的命令是这样的:

第一步= G

第二步= S

第三步= F

第四步= A

我想选择每个产品的最高级状态,例如,复制此表的以下结果:

product | status
----------------
pen     | F        - which means the pen's already in the 3rd step
pencil  | A        - which means the pencil's already in the 4th step
erase   | F        - which means the erase's already in the 3rd step

我该怎么做?

select group-by distinct informix
1个回答
0
投票

您需要一个表格来对字母进行排序(例如status_sequence):

 status    sequence
 A         4
 F         3
 S         2
 G         1

然后将其与您的主查询合并,然后在status_sequence.sequence列上排序。您也可以在其上使用MAX

DROP TABLE IF EXISTS status_sequence;

CREATE TABLE status_sequence
(
    STATUS CHAR(1) NOT NULL PRIMARY KEY,
    SEQUENCE INTEGER NOT NULL UNIQUE
);

DROP TABLE IF EXISTS product_status;
CREATE TABLE product_status
(
    product VARCHAR(10) NOT NULL,
    STATUS  CHAR(1) NOT NULL REFERENCES status_sequence(STATUS),
    PRIMARY KEY(product, STATUS)
);

INSERT INTO status_sequence VALUES('A', 4);
INSERT INTO status_sequence VALUES('F', 3);
INSERT INTO status_sequence VALUES('S', 2);
INSERT INTO status_sequence VALUES('G', 1);

INSERT INTO product_status VALUES('pen', 'F');
INSERT INTO product_status VALUES('pen', 'G');
INSERT INTO product_status VALUES('pen', 'S');
INSERT INTO product_status VALUES('pencil', 'A');
INSERT INTO product_status VALUES('pencil', 'G');
INSERT INTO product_status VALUES('erase', 'F');
INSERT INTO product_status VALUES('erase', 'S');

SELECT ps.product, ps.STATUS
  FROM product_status AS ps
  JOIN status_sequence AS ss ON ps.STATUS = ss.STATUS
  JOIN (SELECT p2.product, MAX(s2.SEQUENCE) AS max_seq
          FROM product_status  AS p2
          JOIN status_sequence AS s2 ON s2.STATUS = p2.STATUS
         GROUP BY p2.product
       ) AS ms
    ON ss.SEQUENCE = ms.max_seq AND ps.product = ms.product
 ORDER BY ms.max_seq

输出:

erase      F
pen        F
pencil     A

请注意,您可以按未选中的列进行排序。

© www.soinside.com 2019 - 2024. All rights reserved.