如何使用 Informix select 从一组随机字母中获取更高的值?
How to select the higher value from group of random letters with Informix?
我在 table 中有一列代表产品的检验类型。
product | status
-----------------
pen | F
pen | G
pen | S
pencil | A
pencil | G
erase | F
erase | S
erase | F
在一个过程中,每个检查都是在不同的固定步骤中完成的。但是这些字母并不是按照这些步骤排序的。
他们的顺序是这样的:
第一步 = G
第二步=S
第三步=F
第四步 = A
我想要select每个产品的最高级状态,例如,重现此table的以下结果:
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
我该怎么做?
您需要 table 来对字母进行排序(例如 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
请注意,您可以按未选择的列进行排序。
我在 table 中有一列代表产品的检验类型。
product | status
-----------------
pen | F
pen | G
pen | S
pencil | A
pencil | G
erase | F
erase | S
erase | F
在一个过程中,每个检查都是在不同的固定步骤中完成的。但是这些字母并不是按照这些步骤排序的。 他们的顺序是这样的:
第一步 = G
第二步=S
第三步=F
第四步 = A
我想要select每个产品的最高级状态,例如,重现此table的以下结果:
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
我该怎么做?
您需要 table 来对字母进行排序(例如 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
请注意,您可以按未选择的列进行排序。