SQL为另一列中的每个唯一值求和一个值

时间:2015-01-21 20:13:07

标签: mysql sql

如果我有这样的表:

------------------------------
|id    |duration |date       |
|1     |20       |1392479451 |<--
|2     |20       |1392479451 |
|3     |10       |1392478620 |<--
|4     |30       |1392479457 |<--
|5     |30       |1392479457 |
|6     |30       |1392479457 |
------------------------------

我只想SUM每个唯一date的第一个:

----------------
|SUM(duration) |
|60            |
----------------

请问我该怎么办?

5 个答案:

答案 0 :(得分:1)

这应该这样做:

SELECT SUM(duration) FROM (
    SELECT duration FROM tbl GROUP BY date
) t;

内部查询中的GROUP BY每个不同的日期只会选择一行。未定义哪一行将被定义,但它并不重要,因为持续时间应该相同。然后我们只是总结持续时间。

编辑:为了清楚起见,这不会选择第一个持续时间,而是任何指定日期的单个持续时间。如果持续时间可能在某个日期内发生变化而您特别需要第一个,那么这将无法解决您的问题。

答案 1 :(得分:0)

您可以尝试这样的事情:

SELECT SUM(IF(`date` = ( SELECT MIN(`date`) FROM table WHERE `date` = t.`date`), `duration`, 0))    
FROM `table` t

或者

SELECT SUM(t1.`duration`) 
FROM `table` t1 
JOIN ( SELECT MIN(`id`) AS `id` FROM `table` GROUP BY `date` ) t2 ON t1.`id` = t2.`id`

答案 2 :(得分:0)

您需要获得第一次约会。有几种方法,但是因为MySQL支持将字符串静默转换为数字,所以你可以使用substring_index() / group_concat()技巧 - 只要每个日期的值不会导致中间字符串溢出(你需要很多价值观)。

以下应该做你想做的事:

select sum(duration + 0)
from (select substring_index(group_concat(duration order by id), ',', 1) as duration
      from table t
      group by date
     ) t;

否则,您需要额外的join

select sum(duration)
from table t join
     (select min(id) as id
      from table t
      group by date
     ) tt
     on t.id = tt.id;

答案 3 :(得分:0)

你可以试试这个:

SELECT 
    SUM(duration)
FROM
    datetable d,
    (SELECT 
        date, MIN(id) AS id
    FROM
        datetable
    GROUP BY date) d2
WHERE
    d.id = d2.id;

答案 4 :(得分:0)

Trying to sum distinct values SQL

SELECT SUM(duration) FROM 
   (SELECT DISTINCT date, duration FROM table)