如果我有这样的表:
------------------------------
|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 |
----------------
请问我该怎么办?
答案 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)