2016-04-29 18 views
1

Ich habe eine Tabelle, wie untenWie bekomme ich eindeutige Werte in 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 

Frage: Wie einzigartig Graf von id für jedes Datum zu erhalten (so dass wir Zählung bekommen nur diejenigen ID, die in den vorherigen Aufzeichnungen nicht gesehen wurden)? So etwas wie das:

Jede ID sollte nur einmal gezählt werden, unabhängig davon, ob es innerhalb der gleichen Datumsgruppe oder sonst auftritt.

+1

Tag der dbms verwendet bitte. –

+2

Betreiben Sie MySQL, SQL Server, Oracle, PostgreSQL oder etwas anderes? – zedfoxus

Antwort

4

Hier ist eine Antwort, die, obwohl ich mich es nicht sicher bin, würde arbeiten:

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; 

Ich weiß, es funktioniert, weil ich mit Ihren Daten getestet, um die Ergebnisse zu erhalten, man wollte.

Dies funktioniert tatsächlich für diese Daten aber wenn Sie hatte eine Verabredung Gruppe, die nur von doppelten IDs bestand, zum Beispiel, wenn unter den Reihen, können Sie eine dieser Zeile mehr ('2016-01-01', 'z2') hatten, werden keine Datensätze angezeigt werden für das 2016-01-01 weil z2 ist ein Duplikat. Wenn Sie eine Zeile in Ihrer Ergebnisse zurückgeben müssen:

2016-01-01 0

dann müssen Sie eine LEFT JOIN mit der GROUP BY.

sqlfiddle hier

+0

bist du sicher, du hast es getestet? Ihre innere Abfrage scheint überhaupt nicht korrekt zu sein. Werfen Sie einen Blick auf die innere GROUP BY. – freetiger

+0

Ja, ich habe es getestet, aber auf MySQL, obwohl es nicht anders sein sollte.Die innere Abfrage stellt sicher, dass jede ID nur einmal in den Daten vorkommt, aber wie gesagt, achten Sie auf die Randbedingungen, wenn Sie erwarten, dass 0 für bestimmte Daten zählt. – Spade

+0

SQL92 und frühere Versionen erlauben keine Abfragen, für die die SELECT-Liste, HAVING-Bedingung oder ORDER BY-Liste auf nicht aggregierte Spalten verweist, die weder in der GROUP BY-Klausel benannt noch funktional von (eindeutig bestimmt) GROUP BY-Spalten https : //dev.mysql.com/doc/refman/5.7/en/group-by-handling.html – freetiger

4

konnte Sie Gruppe durch das Datum und die Anwendung eine deutliche Zählung auf die ID pro Gruppe:

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

Dies betrifft nicht die wiederholten IDs, da es nur IDs * innerhalb * eines Datums und nicht * über * Datumsangaben entfernen würde. – zimdanen

+0

obigen Kommentar ist absolut richtig! Um dies zu verdeutlichen, wird hier eine ID als UNIQUE bezeichnet, wenn sie in den vorherigen Daten noch nie gesehen wurde. – freetiger

+3

Ich verstehe nicht, warum Leute eine falsche Antwort upvoting sind. Lesen sie überhaupt die Frage? – 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 

Dies würde Ihnen ein Resultset von dem Datum, der id, und wie oft, dass id wurde in diesem Datum gefunden.

Entfesseln Sie die Kraft der Verbindung zu Select-Anweisungen mit Aggregaten.

+1

das wird nicht funktionieren. Bitte überprüfen Sie die Frage noch einmal! – 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

das funktioniert auch! – freetiger

+0

überprüfen Sie bitte die Antwort, wenn es Ihnen gefällt –

0

Edit: Mist, sorry Spade. Im Folgenden finden Sie ein Beispiel dafür, worauf sich Spade bezog, wenn Sie eine Null für triviale event_date-Einträge anzeigen wollten.

ich etwas entlang der Linien von diesem tun würde ...

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 
Verwandte Themen