Mysql refrencing abgeleitete Tabellen aus verschachtelten Abfrage
-
26-10-2019 - |
Frage
Ich stellte etwas ähnliches wie gestern, aber jetzt möchte ich etwas anderes von meinem Abfrage-
Ich versuche, die Abfrage einer Datenbank abrufen, die Anzahl der einmaligen Benutzer eine website besucht haben, über die Zeit.Die Daten sieht wie folgt aus:
Day | UserID
1 | A
1 | B
2 | B
3 | A
4 | B
4 | C
5 | D
Ich möchte das Ergebnis der Abfrage zu sehen, das diese
Time Span | COUNT(DISTINCT UserID)
Day 1 to Day 1 | 2
Day 1 to Day 2 | 1
Day 1 to Day 3 | 0
Day 1 to Day 4 | 1
Day 1 to Day 5 | 2
Das Ergebnis ist 2,1,0,1,2, denn am Ende dieser Tage, es gibt X die Anzahl der Benutzer, die besucht haben, ein einziges mal.z.B.für Tag 5 am Ende von Tag 5, Benutzer c und d nur einmal besucht jeden.
Ich glaube, ich bin auf der Suche für eine Abfrage wie diese:
select d.day, (select count(distinct userid) from visits where day<=d.day)
from (select distinct day from visits) d
Der Unterschied zwischen der obigen Abfrage und das, was ich Suche ist, dass ich möchte diese neue Abfrage zu prüfen, nur einmalige Benutzer für jede Zeitspanne, und nicht zu wiederholen Benutzer.
Vielen Dank
Lösung
Diese Unterabfrage sollte Arbeit für die Klärung der Anforderungen.
select d.day, count(distinct case when b.userid is null then a.userid end)
from (select day from visits group by day) d
inner join
(
select a.day, a.userid, count(*) c
from visits a
join visits b on a.userid=b.userid and b.day <= a.day
group by a.day, a.userid
having count(*) = 1
) a on a.day <= d.day
left join
(
select a.day, a.userid, count(*) c
from visits a
join visits b on a.userid=b.userid and b.day <= a.day
group by a.day, a.userid
having count(*) > 1
) b on a.userid = b.userid and b.day <= d.day
group by d.day
Original
Sie hatten die Idee von SQL Server - es ist die einzige RDBMS (IIRC), dass Sie die Referenz ein, zweimal entfernt (nesting -) Abfrage.Bitte angeben, was Sie möchten, und wir können die Abfrage schreiben.
Für die genaue Abfrage angezeigt, die Sie nicht brauchen, 2 Ebenen der Unterabfrage
SELECT
C.col_c1 AS Data,
(
SELECT count(col_b1)
FROM tbl
WHERE col_b2 <= C.col_c1
) A
FROM (
SELECT col_c1 # subquery to get distinct c1
FROM tbl
GROUP BY col_c1) C;