2016-11-21 4 views
1

Ich habe ein kleines Problem. Die Daten:Zählen gruppierten Spalten und gruppieren sie über andere Spalte

 
2016-11-09 0536B088-D3DE-4C0E-903F-C2463D0AAB7E 
2016-11-09 866D70EC-93FD-4C30-BC54-C7B954F255BE 
2016-11-09 6C090D6B-9842-4CB0-9E10-F9B941C8D3A1 
2016-11-09 FB1DD63E-F098-4191-B8F4-BEA4F9776B54 
2016-11-09 FB1DD63E-F098-4191-B8F4-BEA4F9776B54 
2016-11-10 0536B088-D3DE-4C0E-903F-C2463D0AAB7E 
2016-11-10 NULL 
2016-11-10 0536B088-D3DE-4C0E-903F-C2463D0AAB7E 
2016-11-11 0536B088-D3DE-4C0E-903F-C2463D0AAB7E 
2016-11-11 0536B088-D3DE-4C0E-903F-C2463D0AAB7E 

Von ihm will ich UserId und Gruppe über Datum zählen. ich sollte wie folgt sein:

 
Date | Unique | Returning | New 
..09 | 4  | 1   | 3 
..10 | 2  | 1   | 1 
..11 | 1  | 1   | 0 

Wie kann ich es tun? Ich habe diese Abfrage.

select 
    cast(EventTime as date) as 'Date', 
    count(distinct UserId) + count(distinct case when UserId is null then 1 end) as 'Unique users', 
    0 as 'Returning users', 
    0 as 'New users' 
from 
    TelemetryData 
where 
    DiscountId = '5F8851DD-DF77-46DC-885E-46ECA93F021C' and EventName = 'DiscountClick' 
group by 
    cast(EventTime as date)` 

Einzigartige Benutzer = einzigartig mit NULL auch!

returing users = Benutzer-ID, die isnull(sum(case when UserId(here shoudld be count) > 1 then 1 else 0 end), 1)

Neue Benutzer mehr als 1 mal angeklickt, die nur eine angeklickt! isnull(sum(case when UserId(count also) = 1 then 1 else 0 end), 1)

@EDIT: Ok, zwei Ihrer Ergebnisse funktionieren perfekt. Aber ich muss es jetzt mit anderen Abfragen integrieren. SELECT '5F8851DD-DF77-46DC-885E-46ECA93F021C', cast([dbo].[TelemetryData].[EventTime] as date) as 'Date', sum(case when [dbo].[TelemetryData].[EventName] = 'DiscountLike' then 1 else 0 end) as 'Likes', sum(case when [dbo].[TelemetryData].[EventName] = 'DiscountDislike' then 1 else 0 end) as 'Dis likes', sum(case when [dbo].[TelemetryData].[EventName] = 'DiscountSharing' then 1 else 0 end) as 'Shares', SUM(case when [dbo].[TelemetryData].[EventName]='DiscountView' then 1 else 0 end) as 'Views', SUM(case when [dbo].[TelemetryData].[EventName]='DiscountClick' then 1 else 0 end) as 'Clicks', Sum(case when [dbo].[TelemetryData].[EventName] = 'DiscountCode' then 1 else 0 end) as 'Downloaded codes', Sum(case when [dbo].[TelemetryData].[EventName] = 'DiscountSave' then 1 else 0 end) as 'Saves', sum(case when [dbo].[TelemetryData].[EventName] = 'DiscountClickWWW' then 1 else 0 end) as 'Page redirections', Round( cast(Sum(case when [dbo].[TelemetryData].[EventName]='DiscountClick' then 1 else 0 end) as float) / cast( case when SUM(case when [dbo].[TelemetryData].[EventName]='DiscountView' then 1 else 0 end) = 0 then 1 else SUM(case when [dbo].[TelemetryData].[EventName]='DiscountView' then 1 else 0 end) end as float) * 100, 2) as 'Average CTR', 0 as 'Unique users', 0 as 'New users', 0 as 'Returning users', Sum(case when [dbo].[TelemetryData].[EventName] = 'DiscountCommentPositive' then 1 else 0 end) as 'Positive comments', sum(case when [dbo].[TelemetryData].[EventName] = 'DiscountCommentNegative' then 1 else 0 end) as 'Negative comments' from [dbo].[TelemetryData] where [dbo].[TelemetryData].[DiscountId] = '5F8851DD-DF77-46DC-885E-46ECA93F021C' and ([dbo].[TelemetryData].[EventName] = 'DiscountView' or [dbo].[TelemetryData].[EventName] = 'DiscountClick' or [dbo].[TelemetryData].[EventName] = 'DiscountDislike' or [dbo].[TelemetryData].[EventName] = 'DiscountCode' or [dbo].[TelemetryData].[EventName] = 'DiscountLike' or [dbo].[TelemetryData].[EventName] = 'DiscountSharing' or [dbo].[TelemetryData].[EventName] = 'DiscountClickWWW' or [dbo].[TelemetryData].[EventName] = 'DiscountSave' or [dbo].[TelemetryData].[EventName] = 'DiscountCommentPositive' or [dbo].[TelemetryData].[EventName] = 'DiscountCommentNegative') group by cast([dbo].[TelemetryData].[EventTime] as date) order by cast([dbo].[TelemetryData].[EventTime] as date) asc

Jetzt wird es schwer sein ...

+0

Ihre Beispieldaten haben zwei Spalten (welche?), Aber Ihre Abfrage verweist auf mindestens 3 Spalten. – jarlh

+0

Welches DBMS benutzen Sie? –

+0

Daten haben mehr Spalten, aber ich brauche olny operieren auf diesen beiden. Daten und Benutzer-ID. – Nerf

Antwort

1

Sie möchten aggregierte Benutzerinformationen in Ihren Ergebnissen. Eine naheliegende und einfache Lösung besteht darin, nach Datum und Benutzer zuerst zu gruppieren, um diese Informationen pro Benutzer und Datum und erst später erst nach Datum gruppieren zu können.

select 
    eventdate, 
    count(*) as unique_users, 
    count(case when cnt > 1 then 1 end) as returning_users, 
    count(case when cnt = 1 then 1 end) as new_users 
from 
(
    select cast(eventtime as date) as eventdate, userid, count(*) as cnt 
    from telemetrydata 
    where ... 
    group by cast(eventtime as date), userid 
) date_user 
group by eventdate; 
+0

Funktioniert nicht. Nachricht 156, Ebene 15, Status 1, Zeile 44 Falsche Syntax in der Nähe des Schlüsselworts 'unique'. Msg 102, Ebene 15, Status 1, Zeile 53 Falsche Syntax in der Nähe von 'date_user'. – Nerf

+0

Okay. Das lehrt uns: Verwenden Sie keine reservierten Wörter für Spalten, Tabellen und Aliase :-) Da dies SQL Server ist, verwenden Sie '[unique]'. (In einem mehr standardkonformen DBMS würden Sie stattdessen "unique" verwenden). Oder verwende einen anderen Namen wie 'unique_users'. –

+0

Rechts. Funktioniert gut. Danke. – Nerf

0

Könnte ich Sie nicht in Frage sein, verstehen, sondern scheint auf Ihre Daten suchen, dass Sie

select 
    date 
    , count(*) as unique 
    , (count(*) - count(distinct user_id)) as returning 
    , count(distinct user_id) as new 

group by date 
were user_id is not null 
0

Versuchen unter Abfrage

select Date, uniques, returning, uniques-returning as new 
from ( 
    select Date, 
      sum(case when row_num = 1 then 1 else 0 end) uniques, 
      sum(case when row_num = 2 then 1 else 0 end) returning 
    from( 
     select cast(EventTime as date) as Date, 
       ROW_NUMBER() over(partition by EventTime, userid order by EventTime) row_num 
     from TelemetryData) cte1  
    group by Date)cte2 
brauchen

Hoffe, das sollte Ihnen helfen

+0

Fehler: Nachricht 164, Ebene 15, Status 1, Zeile 51 Jeder GROUP BY-Ausdruck muss mindestens eine Spalte enthalten, die keine äußere Referenz ist. Msg 8155, Ebene 16, Status 2, Zeile 51 Für die Spalte 1 von 'cte2' wurde kein Spaltenname angegeben. – Nerf

+0

Die Abfrage wurde aktualisiert, um den Fehler zu beheben. – Viki888

+0

Nah Ergebnis sind falsch. – Nerf

0

Versuchen Sie, diese mit einer Common Table Expression:

Setup-

CREATE TABLE #TelemetryData 
(
    EventTime Date, 
    UserId UNIQUEIDENTIFIER NULL 
    ) 


INSERT INTO #TelemetryData 
VALUES 
('2016-11-09', '0536B088-D3DE-4C0E-903F-C2463D0AAB7E'), 
('2016-11-09', '866D70EC-93FD-4C30-BC54-C7B954F255BE'), 
('2016-11-09', '6C090D6B-9842-4CB0-9E10-F9B941C8D3A1'), 
('2016-11-09', 'FB1DD63E-F098-4191-B8F4-BEA4F9776B54'), 
('2016-11-09', 'FB1DD63E-F098-4191-B8F4-BEA4F9776B54'), 
('2016-11-10', '0536B088-D3DE-4C0E-903F-C2463D0AAB7E'), 
('2016-11-10', NULL), 
('2016-11-10', '0536B088-D3DE-4C0E-903F-C2463D0AAB7E'), 
('2016-11-11', '0536B088-D3DE-4C0E-903F-C2463D0AAB7E'), 
('2016-11-11', '0536B088-D3DE-4C0E-903F-C2463D0AAB7E') 

Abfrage

;WITH CTE 
AS 
(
    SELECT EventTime, 
      UserId, 
      COUNT(*) cnt, 
      ROW_NUMBER() OVER (PARTITION BY EventTime ORDER BY EventTime) RN 
    FROM #TelemetryData 
    GROUP BY EventTime, UserId 
) 

SELECT EventTime, 
     MAX(RN) AS [Unique], 
     SUM(CASE WHEN cnt > 1 THEN 1 ELSE 0 END) as New, 
     SUM(CASE WHEN cnt = 1 THEN 1 ELSE 0 END) AS Returning 
FROM CTE 
GROUP BY EventTime 

Ergebnisse

EventTime Unique New Returning 
2016-11-09 4  1 3 
2016-11-10 2  1 1 
2016-11-11 1  1 0 
0

Die folgende Abfrage sollte funktionieren:

select EventTime, 
    max(DistinctRank) [Unique], 
    sum(CountOfDistinct - 1) Returning, 
    max(DistinctRank) - sum(CountOfDistinct - 1) New 
from 
    (select distinct EventTime, 
     UserId, 
     rank() over (partition by EventTime order by UserId) DistinctRank, 
     count(1) over (partition by EventTime, UserId) CountOfDistinct 
    from TelemetryData) sub 
group by EventTime 

Die Unterabfrage (separat laufen und sehen Sie selbst) wird wieder die einzigartigen Kombinationen von Eventtime und Benutzer-ID, zusammen mit dem Rang eines jeden einzelnen Benutzer-ID für ein bestimmtes Datum und die Anzahl der unterschiedlichen Werte für jede Kombination aus Eventtime und Benutzer-ID:

EventDate    UserId        DistinctRank CountOfDistinct 
2016-11-09 00:00:00.000 0536B088-D3DE-4C0E-903F-C2463D0AAB7E 1    1 
2016-11-09 00:00:00.000 6C090D6B-9842-4CB0-9E10-F9B941C8D3A1 2    1 
2016-11-09 00:00:00.000 866D70EC-93FD-4C30-BC54-C7B954F255BE 3    1 
2016-11-09 00:00:00.000 FB1DD63E-F098-4191-B8F4-BEA4F9776B54 4    2 
2016-11-10 00:00:00.000 NULL         1    1 
2016-11-10 00:00:00.000 0536B088-D3DE-4C0E-903F-C2463D0AAB7E 2    2 
2016-11-11 00:00:00.000 0536B088-D3DE-4C0E-903F-C2463D0AAB7E 1    2 

Dann wird die äußere Abfrage erhält die maximale DistinctRank für jede uniq Dieses Paar ist die Anzahl der eindeutigen UserIds für das EventDate und im Wesentlichen die Summe der Unterabfragedatensätze, für die in UserId Dubletten für ein bestimmtes EventDate vorhanden waren. Dies ist die Anzahl der wiederkehrenden Benutzer. Die Spalte Neu ist nur der Unterschied zwischen Unique und Returning. Das Ergebnis lautet:

Event Date    Unique Returning New 
2016-11-09 00:00:00.000 4  1   3 
2016-11-10 00:00:00.000 2  1   1 
2016-11-11 00:00:00.000 1  1   0 
Verwandte Themen