2015-01-21 6 views
0

Если у меня есть таблица вроде этого: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   | 
---------------- 

Как сделать Я делаю это, пожалуйста?

+0

вам нужно использовать 'group by date' по вашему запросу –

ответ

1

Это должно сделать это:

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

GROUP BY во внутреннем запросе будет выбрать только одну строку для каждого отличная дата. Какая строка будет выбрана, не определена, но это не имеет значения, так как длительность должна быть одинаковой. Затем мы просто суммируем длительность.

EDIT: Просто чтобы быть ясно, что это не будет выбора длительности в первый, но любой сингл продолжительность данной даты. Если продолжительность может меняться в течение даты, и вам определенно нужен первый, это не решит вашу проблему.

+0

Это использует расширение MySQL, которое явно предупреждает об использовании. В подзапросе нет гарантии, что 'duration' является« первой »записью для' date'. –

+0

@ GordonLinoff Я думаю, что я был ясно в этом вопросе. Я понимаю, что 'duration' не меняется в течение заданной даты. – shmosel

+0

. , Ничто в вопросе не говорит о том, что «продолжительность» должна быть уникальной для каждой даты. Если это так, вы можете также «группировать по дате, длительности» и избегать необходимости нестандартного SQL. –

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` 
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; 
0

Вы можете попробовать это:

SELECT 
    SUM(duration) 
FROM 
    datetable d, 
    (SELECT 
     date, MIN(id) AS id 
    FROM 
     datetable 
    GROUP BY date) d2 
WHERE 
    d.id = d2.id; 
Смежные вопросы

 Смежные вопросы