-1

我有以下数据:

id  customer  date                value1  value2  isTrue
10  13  2013-08-20 00:00:00.0000  170     180680  0
11  13  2013-09-02 00:00:00.0000  190     181830  0
12  13  2013-09-07 00:00:00.0000  150     183000  1
13  13  2013-09-14 00:00:00.0000  150     183930  0
14  13  2013-09-16 00:00:00.0000  150     184830  0
15  13  2013-09-19 00:00:00.0000  150     185765  1
16  13  2013-09-30 00:00:00.0000  800     187080  0
17  13  2013-10-02 00:00:00.0000  100     188210  0
28  13  2013-10-04 00:00:00.0000  380     188250  1

我怎样才能得到以下结果,其中 SumValue1 是 value1 的总和,直到字段 isTrue 为 True 并在之后重置,Difference Value2 是每次 IsTrue 字段为 True 时字段 value2 的差异?

id  customer  date                value1  value2  isTrue  SumValue1  DifferenceValue2
10  13  2013-08-20 00:00:00.0000  170     180680  0
11  13  2013-09-02 00:00:00.0000  190     181830  0
12  13  2013-09-07 00:00:00.0000  150     183000  1       510        2320
13  13  2013-09-14 00:00:00.0000  150     183930  0
14  13  2013-09-16 00:00:00.0000  150     184830  0
15  13  2013-09-19 00:00:00.0000  150     185765  1       450        2765
16  13  2013-09-30 00:00:00.0000  800     187080  0
17  13  2013-10-02 00:00:00.0000  100     188210  0
28  13  2013-10-04 00:00:00.0000  380     188250  1       1280       2485
4

1 回答 1

0

假设id排序,此查询将执行:

SELECT
    id, customer, date, value1, value2, isTrue,
    CASE isTrue WHEN 1 THEN (SELECT TOTAL(value1) FROM t WHERE customer=t2.customer AND id>t2.prev_id AND id<=t2.id) END AS SumValue1,
    CASE isTrue WHEN 1 THEN value2-(SELECT value2 FROM t WHERE customer=t2.customer AND id=t2.prev_id) END AS DifferenceValue2
FROM (SELECT *, CASE isTrue WHEN 1 THEN COALESCE((SELECT id FROM t AS _ WHERE customer=t.customer AND date<t.date AND isTrue ORDER BY date DESC LIMIT 1), -1) END AS prev_id FROM t) AS t2;

一步一步:

以前的idwhereisTrue由:

SELECT id FROM t AS _ WHERE customer=t.customer AND date<t.date AND isTrue ORDER BY date DESC LIMIT 1

使用将确保在所有其他 ( ) 之前COALESCE(..., -1)为非空。id-1

SELECT *, CASE isTrue WHEN 1 THEN ... END AS prev_id FROM t将返回添加t列的所有行prev_id

最后,查询SELECT TOTAL(value1) FROM t WHERE customer=t2.customer AND id>t2.prev_id AND id<=t2.idvalue2-(SELECT value2 FROM t WHERE customer=t2.customer AND id=t2.prev_id覆盖以前的结果将返回所需的结果。

于 2013-10-07T08:31:44.883 回答