2016-04-29 3 views
1

У меня есть таблица, как показано нижеКак получить уникальные значения в SQL?

event_date id  
---------- --- 
2015-11-18 x1 
2015-11-18 x2 
2015-11-18 x3 
2015-11-18 x4 
2015-11-18 x5 
2015-11-19 x1 
2015-11-19 x2 
2015-11-19 y1 
2015-11-19 y2 
2015-11-19 y3 
2015-11-20 x1 
2015-11-20 y1 
2015-11-20 z1 
2015-11-20 z2 

Вопрос: Как получить уникальный идентификатор счетчика для каждой даты (например, что мы получаем подсчет только те иды, которые не были замечены в предыдущих отчетах)? Что-то вроде этого:

event_date count(id) 
----------- --------- 
2015-11-18  5 
2015-11-19  3 
2015-11-20  2 

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

+1

Tag СУБД используются пожалуйста. –

+2

Вы используете MySQL, SQL Server, Oracle, PostgreSQL или что-то еще? – zedfoxus

ответ

4

Вот ответ, который будет работать, хотя я не уверен, что мне это нравится:

select t.event_date, 
     count(1) 
from ( 
     -- Record first occurrence of each id along with the earliest date occurred 
     select id, 
       min(event_date) as event_date 
     from 
     mytable 
     group by id 
    ) t 
group by t.event_date; 

Я знаю, что это работает, потому что я тестировал с вашими данными, чтобы получить результаты, которые вы хотели.

Это на самом деле работает для этих данных, но если у вас есть дата группа, которая состояла только из повторяющихся идентификаторов, например, если среди строк, вы имели еще один ряд ('2016-01-01', 'z2') это не будет отображаться никаких записей для этого 2016-01-01 потому что z2 является дубликат. Если вам необходимо вернуть строку в результатах:

2016-01-01 0

то, что вам нужно использовать LEFT JOIN с GROUP BY.

sqlfiddle здесь

+0

вы уверены, что вы его протестировали? Ваш внутренний запрос не кажется правильным. Взгляните на внутреннюю группу GROUP BY. – freetiger

+0

Да, я тестировал его, но на MySQL, хотя он не должен отличаться.Внутренний запрос гарантирует, что каждый идентификатор появляется только один раз в данных, но, как я уже сказал, следите за краевыми условиями, когда вы ожидаете, что 0 будет считаться для определенных дат. – Spade

+0

SQL92 и ранее не разрешают запросы, для которых список выбора, условие HAVING или ORDER BY относятся к неагрегированным столбцам, которые не имеют ни имени в предложении GROUP BY, ни функционально зависят от столбцов GROUP BY (однозначно определенных). https : //dev.mysql.com/doc/refman/5.7/en/group-by-handling.html – freetiger

4

Вы могли группа по дате и применить подсчет различного идентификатора в группу:

SELECT event_date, COUNT(DISTINCT id) 
FROM  mytable 
GROUP BY event_date 
+2

Это не относится к повторным идентификаторам, так как оно удаляет только ids * внутри * даты, а не * через * даты. – zimdanen

+0

выше комментарий абсолютно правильный! Чтобы уточнить, здесь идентификатор будет называться UNIQUE, если он никогда не был замечен в предыдущие даты. – freetiger

+3

Я не понимаю, почему люди верят неправильный ответ. Они даже читают вопрос? – freetiger

-1
SELECT 
    mytable.event_date 
    event_date_count.id, 
    event_date_count.event_date_count 
FROM 
    mytable 
    INNER JOIN 
     (
     SELECT 
      id, 
      event_date, 
      COUNT(event_date) as event_date_count 
     FROM 
      mytable 
     GROUP BY 
      id, 
      event_date 
     ) event_date_count 
    ON event_date_count.event_date = mytable.event_date 

Это даст вам ResultSet о дате, ид, и сколько раз, что идентификационный номер был найден в эту дату.

Высвободите силу соединения при выборе операторов с агрегатами.

+1

это не сработает. Пожалуйста, снова проверьте вопрос! – freetiger

0
SELECT EVENT_DATE,COUNT (DISTINCT ID) 
FROM  MYTABLE 
WHERE NOT EXISTS 
     (SELECT * FROM MYTABLE T2 WHERE  
     T2.EVENT_DATE<MYTABLE.EVENT_DATE AND T2.ID=MYTABLE.ID) 
GROUP BY EVENT_DATE 
+0

этот тоже работает! – freetiger

+0

, пожалуйста, проверьте ответ, если вам это нравится –

0

Edit: Дерьмо, извините лопата. Ниже приведен пример того, что Spade имел в виду, если вы хотите, чтобы нуль отображался для тривиальных записей event_date.

Я хотел бы сделать что-то вдоль линий этого ...

select 
a.event_date, 
count(a.id) cnt_id 
from 
table_name a 
left outer join 
(
    select x.id, min(x.event_date) min_event_date from table_name x 
) b on 
    a.id = b.id AND 
    a.event_date = b.min_event_date 
GROUP BY 
a.event_date 
Смежные вопросы