我们有3列rx, dateTime and tx
。一个rx可以有多个tx。
表格是table1
如果rx
同时具有tx < 8 and tx> 8
类型,则选择tx<8
的完整行。
如果rx
只有tx>8
,则选择唯一的最新tx
。
有人可以帮忙吗?
以下是示例:
注意更高的日期时间值确定最新
rx tx date time
1 9 24
1 7 23
1 4 23
1 10 26
2 10 4
2 14 8
2 18 20
2 9 19
预期结果:
rx tx datetime
1 7 23
1 4 23
2 18 20
Db是Informix 注意:-no对tx&lt; 8没有操作,并且没有tx = 8
的数据答案 0 :(得分:1)
让我们准备你给出的测试用例:
[infx1210@tardis tmp]$ dbaccess -e demo test.sql
Database selected.
CREATE TABLE table1 (
rx SMALLINT,
tx SMALLINT,
date_time SMALLINT
);
Table created.
INSERT INTO table1 VALUES (1, 9, 24);
1 row(s) inserted.
INSERT INTO table1 VALUES (1, 7, 23);
1 row(s) inserted.
INSERT INTO table1 VALUES (1, 4, 23);
1 row(s) inserted.
INSERT INTO table1 VALUES (1, 10, 26);
1 row(s) inserted.
INSERT INTO table1 VALUES (2, 10, 4);
1 row(s) inserted.
INSERT INTO table1 VALUES (2, 14, 8);
1 row(s) inserted.
INSERT INTO table1 VALUES (2, 18, 20);
1 row(s) inserted.
INSERT INTO table1 VALUES (2, 9, 19);
1 row(s) inserted.
SELECT * FROM table1;
rx tx date_time
1 9 24
1 7 23
1 4 23
1 10 26
2 10 4
2 14 8
2 18 20
2 9 19
8 row(s) retrieved.
Database closed.
[infx1210@tardis tmp]$
案例1:如果
rx
同时具有tx < 8 and tx > 8
类型,则选择tx < 8
的完整行。
SELECT t1.rx,
t1.tx,
t1.date_time
FROM table1 t1
INNER JOIN (
SELECT rx,
MAX(tx) AS max_tx,
MIN(tx) AS min_tx
FROM table1
GROUP BY 1
) t2 ON t1.rx = t2.rx
WHERE 8 BETWEEN t2.min_tx AND t2.max_tx
AND t1.tx < 8;
案例2 如果
rx
只有tx > 8
,则选择唯一一个最新的tx
,因此date_time
<更高/ p>
SELECT t1.rx,
t1.tx,
t1.date_time
FROM table1 t1
INNER JOIN (
SELECT rx,
MIN(tx) AS min_tx,
MAX(date_time) AS latest_tx
FROM table1
GROUP BY 1
) t2 ON t1.rx = t2.rx
WHERE t2.min_tx > 8
AND t1.date_time = t2.latest_tx;
现在,可以使用UNION语句来组合结果集:
SELECT t1.rx,
t1.tx,
t1.date_time
FROM table1 t1
INNER JOIN (
SELECT rx,
MAX(tx) AS max_tx,
MIN(tx) AS min_tx
FROM table1
GROUP BY 1
) t2 ON t1.rx = t2.rx
WHERE 8 BETWEEN t2.min_tx AND t2.max_tx
AND t1.tx < 8
UNION
SELECT t1.rx,
t1.tx,
t1.date_time
FROM table1 t1
INNER JOIN (
SELECT rx,
MIN(tx) AS min_tx,
MAX(date_time) AS latest_tx
FROM table1
GROUP BY 1
) t2 ON t1.rx = t2.rx
WHERE t2.min_tx > 8
AND t1.date_time = t2.latest_tx;