2017-08-02 157 views
0

我有以下表test最小/最大 「總和」 的

+----+-------+ 
| id | value | 
+----+-------+ 
| 1 | -3 | 
| 2 | -5 | 
| 3 | 10 | 
| 4 | -1 | 
+----+-------+ 

對於MIN(值)I得到-5,爲MAX(值)I得到10,以及用於SUM(值)我得到1.但是,我希望逐步獲得表中的最小值和最大值。

實施例1:SELECT AWESOME_FUNCTION_SUM_MIN(value) FROM test ORDER BY id ASC

這應返回-8(第一行是-3,加在第二行-5超過所有值的過程中的最低值的結果)。

實施例2:SELECT AWESOME_FUNCTION_SUM_MAX(value) FROM test ORDER BY id ASC

這應返回2(第一行-3,第二-5,和第三行10導致的最高值以上的所有值的過程中)。

很明顯,ORDER BY沒有意義,因爲它用於排序查詢的結果,但爲了演示目的,我在這裏使用它。對我而言,這是一個基本的功能,所以我很驚訝地發現沒有任何關於它的信息。我可能使用了錯誤的關鍵字。有人可以幫我嗎?或者我必須提取所有的值並在外部進行分析(=不是用MySQL)?

+1

你能也張貼預期的結果集? –

回答

0

要獲得累積總和,您可以將自己的表加入。

select min(val) 
    from (select sum(a.value) as val from test a join test b 
    on a.id<=b.id group by b.id) t1; 
/* answer: -8 */ 

select max(val) 
    from (select sum(a.value) as val from test a join test b 
    on a.id<=b.id group by b.id) t1; 
/* answer: 2 */ 
0

創建表格/插入數據。

CREATE TABLE test 
    (`id` INT, `value` INT) 
; 

INSERT INTO test 
    (`id`, `value`) 
VALUES 
    (1, -3), 
    (2, -5), 
    (3, 10), 
    (4, -1) 
; 

的MySQL可是沒有這些功能,但你可以使用自加入模仿他們。

查詢SUM_MIN

SELECT 
SUM(test.value) 
FROM 
test 
INNER JOIN (
    SELECT 
    id 
    FROM 
    test 
    WHERE 
    test.value > 0 
    ORDER BY 
    id ASC 
    LIMIT 1 
) 
AS 
    positive_number 
ON 
test.id < positive_number.id 
ORDER BY 
test.id 

結果

sum(test.value) 
----------------- 
-8    

查詢SUM_MAX

SELECT 
SUM(test.value) 
FROM 
test 
INNER JOIN (
    SELECT 
    id 
    FROM 
    test 
    WHERE 
    test.value > 0 
    ORDER BY 
    id ASC 
    LIMIT 1 
) 
AS 
    positive_number 
ON 
test.id <= positive_number.id 
ORDER BY 
test.id 

結果

sum(test.value) 
----------------- 
2     
0

這裏有一個方法:

SELECT x.* 
    , @least:=LEAST(@least,value) least 
    , @greatest:=GREATEST(@greatest,value) greatest 
    , @i:[email protected]+value running 
    FROM my_table x 
    , (SELECT @least:=1000,@greatest:=-1000,@i:=0) vars 
ORDER 
    BY id; 
+----+-------+-------+----------+---------+ 
| id | value | least | greatest | running | 
+----+-------+-------+----------+---------+ 
| 1 | -3 | -3 |  -3 |  -3 | 
| 2 | -5 | -5 |  -3 |  -8 | 
| 3 | 10 | -5 |  10 |  2 | 
| 4 | -1 | -5 |  10 |  1 | 
+----+-------+-------+----------+---------+