2016-07-06 78 views
1

我想从递增值序列中计算最大值的总和。从多个递增序列中选择最大值的总和

对于这组数据:

time_stamp count 
1467820429 6 * 
1467820428 5 
1467820427 4 
1467820426 3 
1467820416 2 
1467820415 1 
1467820413 0 
1467820412 3 * 
1467820411 2 
1467820409 1 
1467820408 0 
1467820405 1 * 
1467820404 0 
1467820400 5 * 

答案= 6 + 3 + 1 + 5 = 15

我怎么能写一个MySQL兼容SQL语句来acheve这个

+0

你能解释逻辑,你怎么确定他们为最大值 –

+1

这是要痛'mysql的做',当其他主要的'RDBMS'具有一些很好的功能来以更简单的方式做这样的事情时 –

+0

下一个值比它低 – Kevin

回答

0
SELECT SUM(a.cnt) 
    FROM 
    (SELECT x.* 
      , MIN(y.time_stamp) next 
     FROM my_table x 
     LEFT 
     JOIN my_table y 
      ON y.time_stamp > x.time_stamp 
     GROUP 
      BY x.time_stamp 
    ) a 
    LEFT 
    JOIN my_table b 
    ON b.time_stamp = a.next 
    AND b.cnt > a.cnt 
WHERE b.cnt IS NULL; 
-1

您需要GROUP BY和HAVING,如下所示:

select sum (count) 
from table 
group by time_stamp 
having count = max(count) 
+0

** NMDV **,这不会得到预期的结果 –

1

你可以用下面的方法得到它

mysql> select time_stamp,count,if (count=0,@curRank :=0,@curRank := @curRank + 1) as rank from ff,(SELECT @curRank := 0) r; 
+------------+-------+------+ 
| time_stamp | count | rank | 
+------------+-------+------+ 
| 1467820429 |  6 | 1 | 
| 1467820428 |  5 | 2 | 
| 1467820427 |  4 | 3 | 
| 1467820426 |  3 | 4 | 
| 1467820415 |  2 | 5 | 
| 1467820415 |  1 | 6 | 
| 1467820413 |  0 | 0 | 
| 1467820412 |  3 | 1 | 
| 1467820411 |  2 | 2 | 
| 1467820409 |  1 | 3 | 
| 1467820408 |  0 | 0 | 
| 1467820405 |  1 | 1 | 
| 1467820404 |  0 | 0 | 
| 1467820408 |  5 | 1 | 
+------------+-------+------+ 
14 rows in set (0.00 sec) 

mysql> SELECT * FROM (select time_stamp,count,if (count=0,@curRank :=0,@curRank := @curRank + 1) as rank from ff,(SELECT @curRank := 0) r) t WHERE rank=1; 
+------------+-------+------+ 
| time_stamp | count | rank | 
+------------+-------+------+ 
| 1467820408 |  5 | 1 | 
| 1467820412 |  3 | 1 | 
| 1467820429 |  6 | 1 | 
| 1467820405 |  1 | 1 | 
+------------+-------+------+ 
4 rows in set (0.00 sec) 

    mysql> SELECT sum(count) as total FROM 
(select time_stamp,count,if (count=0,@curRank :=0,@curRank := @curRank + 1) as rank from ff, 
(SELECT @curRank := 0) r) t WHERE rank=1; 
    +-------+ 
    | total | 
    +-------+ 
    | 15 | 
    +-------+ 
    1 row in set (0.00 sec) 

你可以用简单的内部查询

+0

没有ORDER BY子句,这不能可靠地工作。我注意到你的数据集(目前)与OP的不同。 – Strawberry

+0

@Strawberry是同意的。简单的我们可以使用时间戳命令。对此没有伤害 –

+0

另外,测试不是'当count = 0'时(尽管这也是我的误解,并且在这种情况下会起作用)。根据评论,测试是当'下一个比以前小' – Strawberry

1

得到它,因为我在评论中提到,没有有效的方式Mysql做到这一点ATLEAST据我所知

试试这个

SELECT Sum(CASE 
      WHEN `count` >= prev_cnt THEN `count` 
      ELSE 0 
      END) 
FROM (SELECT *, 
       IFnull((SELECT `count` 
         FROM yourtable b 
         WHERE a.`time_stamp` < b.`time_stamp` 
         ORDER BY `time_stamp` LIMIT 1), `count`) AS prev_cnt 
     FROM yourtable a) c 
+0

谢谢@Prdp – Kevin

0

您需要确定值何时变化。一种获得上一个值的方法使用变量:

select sum(count) 
from (select t.*, 
      (if((@old_c := @c) is null, 0, -- never happens 
       if((@c := count) is not null, @old_c, @old_c) 
       ) 
      ) as prev_count 
     from t cross join 
      (select @c := -1) params 
     order by time_stamp 
    ) t 
where prev_count >= count; 

获得前一个计数的表达式有点复杂。 MySQL不保证表达式求值的顺序,因此赋予新值count和返回旧值需要在一个表达式中。

+0

有没有一个逗号?还有过多的't's?即使纠正这些错误,并忽略了括号,我认为这是不对的。 – Strawberry

+0

@Strawberry。 。 。我确实认为这是正确的(我修复了一个缺失的结论),并且应该有最好的表现。 –

+0

't。* (if('can not be correct。I agree if if it can be done(I could not find out how)then using variables could be faster,but there are errors occurred here。 – Strawberry

-2

非常简单的解决方案: 1将列TIME-STAMP的滞后

2- take the difference of orif time_stamp column and the lag column 

3- sum the values of count after filtering out the records for -1 

    +------------+-------+------+-----------------+-------+ 
| a   | b  | c | d    | a-d | 
| time_stamp | count | flag | lag_time_stamp | diff | 
| 1467820429 | 6  | * | nulll   | null | 
| 1467820428 | 5  |  | 1467820429  | -1 | 
| 1467820427 | 4  |  | 1467820428  | -1 | 
| 1467820426 | 3  |  | 1467820427  | -1 | 
| 1467820416 | 2  | * | 1467820426  | -10 | 
| 1467820415 | 1  |  | 1467820416  | -1 | 
| 1467820413 | 3  | * | 1467820415  | -2 | 
| 1467820412 | 3  |  | 1467820413  | -1 | 
| 1467820411 | 2  |  | 1467820412  | -1 | 
| 1467820409 | 1  | * | 1467820411  | -2 | 
| 1467820408 | 0  |  | 1467820409  | -1 | 
| 1467820405 | 1  | * | 1467820408  | -3 | 
| 1467820404 | 0  |  | 1467820405  | -1 | 
| 1467820400 | 5  | * | 1467820404  | -4 | 
+------------+-------+------+-----------------+-------+ 

--sum the values of the table that we got after filtering the records for -1 

+------------+-------+ 
| time_stamp | count | 
+------------+-------+ 
| 1467820429 |  6 | 
| 1467820416 |  2 | 
| 1467820413 |  3 | 
| 1467820409 |  1 | 
| 1467820405 |  1 | 
| 1467820400 |  5 | 
+------------+-------+ 
+0

我想你'重新混淆'简单'与'错误' – Strawberry