2017-12-28 15 views
0

Ich bin auf der Suche nach einer Abfrage, die alle Einträge finden würde, die eine Anmeldung ohne eine Abmeldung haben.Suche nach einem Eintrag für ein Datum

Meine Daten wie folgt aussehen

Key  Date  Employee 
LOGIN 20171225 111 
LOGIN 20171225 111 
LOGIN 20171226 111 
There should be a record here. I need to catch that. 
LOGIN 20171227 111 
LOGIN 20171227 111 

12345 20171227 222 (Es gibt auch eine Menge anderer Zufallsdaten in der Tabelle.)

Select Date, Employee 
From My Table 
Where Key = 'LOGIN' 
Group by date, employee 
Order by employee 

Ich weiß nicht, wie aus filtern um zu sehen, ob es für diesen Tag ein oder zwei Logins gibt. Ich muss sehen, wo es nur einen gibt, denn das zeigt an, dass sie sich nicht ausgeloggt haben. Das gibt mir nicht die richtigen Informationen.

Vielen Dank.

Antwort

0

Sie könnten dies nutzen

DECLARE @dummyTbl TABLE([Key] VARCHAR(100),[Date] DATE,Employee INT); 
INSERT INTO @dummyTbl VALUES 
('LOGIN','20171225',111) 
,('LOGIN','20171225',111) 
,('LOGIN','20171226',111) 

,('LOGIN','20171227',111) 
,('LOGIN','20171227',111); 

SELECT * 
FROM @dummyTbl 
GROUP BY [Key],[Date],Employee 
HAVING COUNT(*)=1 

Aber ich frage mich, warum Ihr Key ist LOGIN in beiden Fällen, warum nicht verwenden LOGOUT?

+0

Vielen Dank. Ich werde es ausprobieren. Um deine Frage zu beantworten, habe ich keine Ahnung! Ich habe es nicht geschrieben, und ich kann es nicht ändern. Es ist Software, die das Unternehmen vor langer Zeit gekauft hat. –

+0

@CNL In Ordnung, manchmal müssen wir essen, was andere gekocht haben :-D Du musst einen Filter für '[Key] = 'LOGIN'' zu meiner Lösung hinzufügen ... – Shnugo

+0

Danke. Das funktioniert. Ich hatte noch keine Gelegenheit, die anderen Poster anzuschauen, aber ich werde und upvote, wenn ich kann. Ich habe deine Antwort als richtig markiert. Danke noch einmal. –

0

Wenn Ihr Schlüssel immer LogIn ist, dann sollten Sie wirklich nach einer ODD-Anzahl von Einträgen suchen. Welche können Sie mithilfe Rest (%) der Division durch 2 nicht gleich 0.

DECLARE @dummyTbl TABLE([Key] VARCHAR(100),[Date] DATE,Employee INT); 
INSERT INTO @dummyTbl VALUES 
('LOGIN','20171225',111) 
,('LOGIN','20171225',111) 
,('LOGIN','20171226',111) 
,('LOGIN','20171227',111) 
,('LOGIN','20171227',111); 

SELECT * 
FROM @dummyTbl 
GROUP BY [Key],[Date],Employee 
HAVING COUNT(*) % 2 <> 0 

tun Wenn Sie mehrere Schlüssel Login/Logout haben und Sie versuchen, herauszufinden, ob der Benutzer abgemeldet wird es dann am besten auf dem letzten Wert für den Benutzer für den Tag zu sehen und wenn es nicht so ist abzumelden Sie wissen, dass sie in noch angemeldet sind.

DECLARE @dummyTbl TABLE(Id INT IDENTITY(1,1), [Key] VARCHAR(100),[Date] DATE,Employee INT); 
INSERT INTO @dummyTbl VALUES 
('LOGIN','20171225',111) 
,('LOGIN','20171225',111) 
,('LOGOUT','20171225',111) 
,('LOGIN','20171226',111) 
,('LOGIN','20171227',111) 
,('LOGOUT','20171227',111); 

;WITH cteRowNum AS (
    SELECT * 
     ,LastDailyActivityRowNum = ROW_NUMBER() OVER (PARTITION BY Date, Employee ORDER BY Id DESC) 
    FROM 
     @dummyTbl 
) 

SELECT * 
FROM 
    cteRowNum 
WHERE 
    LastDailyActivityRowNum = 1 
    AND [Key] = 'LOGIN' 

wenn Sie möglicherweise unsauberen Daten haben (fehlende Anmeldung oder Aufzeichnung abzumelden) dann wird ein bisschen komplizierter, wo Sie einige geschäftliche Entscheidungen treffen müssen, aber die letzte Record-Methode ist immer noch der Weg zu gehen. Wenn Sie Mitarbeiter haben, die nach Mitternacht arbeiten können, ohne sich abzumelden, wird es auch etwas komplizierter.

Verwandte Themen