为Informix DB准备SQL查询

时间:2016-05-10 05:07:10

标签: sql greatest-n-per-group informix

我们有3列rx, dateTime and tx。一个rx可以有多个tx。

表格是table1

案例1:

如果rx同时具有tx < 8 and tx> 8类型,则选择tx<8的完整行。

案例2:

如果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

的数据

1 个答案:

答案 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;
相关问题