【问题标题】:sql - better way of querying required datasql - 查询所需数据的更好方法
【发布时间】:2018-03-29 14:08:32
【问题描述】:

我有这张桌子快照

A | B   | C  | D
o1| 100 | 20 | i1
o2| 100 | 30 | i1

对于给定的数字,我需要行直到 sum(B-C) >= given_number

例如:

  • 请求 (i1, 80) = o1(因为 100 - 20 = 80 >= 80)

  • 请求 (i1, 100) = o1, o2 { (100 - 20) + (100 - 30) >= 100 }

我正在使用 informix 数据库。请建议mysql具体的解决方案,我会尝试informix等价的。

【问题讨论】:

  • 请展示您到目前为止所做的尝试。如果你为此创建一个 SQLFiddle 会更好。
  • 您可能想要搜索运行总计。这就是你的问题的样子。

标签: mysql sql procedure informix


【解决方案1】:

使用 Informix 12.10.FC8DE 可能是您想要的。

CREATE TABLE test_data
(
    a CHAR(2)
    , b INTEGER
    , c INTEGER
    , d CHAR(2)
);

INSERT INTO test_data VALUES('o1', 100,  20, 'i1');
INSERT INTO test_data VALUES('o2', 100,  30, 'i1');
INSERT INTO test_data VALUES('o3', 100,  15, 'i1');
INSERT INTO test_data VALUES('o4', 100,  45, 'i1');
INSERT INTO test_data VALUES('o5', 100,  20, 'i2');
INSERT INTO test_data VALUES('o6', 100, 100, 'i1');
INSERT INTO test_data VALUES('o7', 100,  30, 'i2');
INSERT INTO test_data VALUES('o8', 100,   5, 'i2');
INSERT INTO test_data VALUES('o9', 100,  60, 'i1');

SELECT * FROM test_data;
a            b           c d    
o1         100          20 i1
o2         100          30 i1
o3         100          15 i1
o4         100          45 i1
o5         100          20 i2
o6         100         100 i1
o7         100          30 i2
o8         100           5 i2
o9         100          60 i1
 9 row(s) retrieved.

有了这个样本数据,我们可以使用(我留下了累积和以便更好地可视化)请求(i1, 80):

SELECT
    *
FROM
(
SELECT
    *
    , SUM (t.b - t.c) 
        OVER 
        (
            ORDER BY t.a
            ROWS BETWEEN UNBOUNDED PRECEDING
            AND CURRENT ROW
        ) AS r_sum 
    , SUM (t.b - t.c) 
        OVER 
        (
            ORDER BY t.a
            ROWS BETWEEN UNBOUNDED PRECEDING
            AND 1 PRECEDING
        ) AS previous_r_sum

FROM
    test_data AS t
WHERE
    t.d = 'i1'
) AS vt1
WHERE
    previous_r_sum < 80 
    OR previous_r_sum IS NULL;

a            b           c d             r_sum   previous_r_sum    
o1         100          20 i1               80
 1 row(s) retrieved.

有了这个样本数据,我们可以使用(我留下了累积和以便更好地可视化)请求(i1, 100):

SELECT
    *
FROM
(
SELECT
    *
    , SUM (t.b - t.c) 
        OVER 
        (
            ORDER BY t.a
            ROWS BETWEEN UNBOUNDED PRECEDING
            AND CURRENT ROW
        ) AS r_sum 
    , SUM (t.b - t.c) 
        OVER 
        (
            ORDER BY t.a
            ROWS BETWEEN UNBOUNDED PRECEDING
            AND 1 PRECEDING
        ) AS previous_r_sum

FROM
    test_data AS t
WHERE
    t.d = 'i1'
) AS vt1
WHERE
    previous_r_sum < 100
    OR previous_r_sum IS NULL;

a            b           c d             r_sum   previous_r_sum
o1         100          20 i1               80
o2         100          30 i1              150               80
 2 row(s) retrieved.

我没有进行任何性能或极端情况测试。

【讨论】:

  • 感谢您的回答。我将尝试运行相同的程序并进行验证。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-11
  • 2012-05-16
  • 2013-06-18
  • 1970-01-01
  • 2016-06-27
  • 2020-10-10
相关资源
最近更新 更多