2016-08-30 4 views
0

Ich habe eine Tabelle mit Daten, die Scans in einem Gebäude speichert, und das enthält weit über eine Million Zeilen von Daten. Ich versuche, eine temporäre Statusspalte innerhalb dieser Abfrage hinzuzufügen, die die Scans auf einer täglichen Basis zählt. Für die Zwecke dieser Frage lässt dies als Tabelle Hauptdaten verwenden:Hinzufügen eines Zählers nach Datum, Benutzer pro Tag zu einer Abfrage

CREATE TABLE DataTable (DataTableID INT IDENTITY(1,1) NOT NULL, 
User VARCHAR(50), 
EventTime DATETIME) 

von diesem Ich habe es verengt nur die Scans für heute zeigen:

SELECT * FROM DataTable 
WHERE CONVERT(DATE,EventTime) = CONVERT(DATE, SYSDATETIME()) 

Es ist an dieser Stelle dem ich eine Statusspalte zu dieser Abfrage hinzufügen möchte. Der Spalt Status:

  • WENN ODD - bedeutet, dass die Person in ist das Gebäude
  • WENN EVEN - bedeutet, dass die Person nicht im Gebäude ist

    (Dies ist einfach ein ganzzahliges Feld, das bei 1 beginnt und an diesem Tag um 1 erhöht wird, PRO USER). Wie würde ich das machen?

  • Ich will diese eine Ansicht machen, nachdem so ihr Wert für den Fall, in denen dies die Syntax Abfrage betrifft

  • Auch seine erwähnenswert, dass ich eine Statusspalte auf die Haupttabelle hinzufügen kann nicht, da dies würde verhindern das Türzugriffsprogramm funktioniert, sonst würde ich hier etwas hinzufügen, um das zu kontrollieren.

Beispiel DATA:

DataTableID   User   EventTime    Status 
    1    Joe    30/08/2016 09:00:00  1 
    2    Alan   30/08/2016 08:45:00  1 
    3    John   30/08/2016 09:02:00  1 
    4    Steven   30/08/2016 07:30:00  1 
    5    Joe    30/08/2016 11:00:00  2 
    6    Mike   30/08/2016 17:30:00  1 
    7    Joe    30/08/2016 12:00:00  3 
+0

Bitte zeigen Sie einige Beispieldaten und erwartetes Ergebnis als Text, erklären mit Beispielen nicht Wörter – TheGameiswar

+0

was ist mit "SELECT als" Status "VON DataTable WHERE CONVERT (DATUM, EventTime) = CONVERT (DATUM, SYSDATETIME ()) " –

+1

Was soll * in * dieser Statusspalte sein? – Blorgbeard

Antwort

1

Sie wollen eine einfache Fensterfunktion für diese. Werfen Sie einen Blick auf die unten stehende Anfrage und lassen Sie mich wissen, wenn Sie Fragen haben. Dies wird von EventTime anstelle von DataTableID für die Windowing angeordnet, es wird dann von DataTableID in der endgültigen Abfrage angeordnet. Dies stellt sicher, dass Sie keine Probleme haben, wenn Ihre Daten nicht in der richtigen Reihenfolge in der Tabelle sind.

Temp-Tabelle zum Testen;

CREATE TABLE #DataTable 
(DataTableID INT IDENTITY(1,1) NOT NULL, 
[User] VARCHAR(50), 
EventTime DATETIME) 

Füllen Sie es mit Beispieldaten;

INSERT INTO #DataTable 
VALUES 
('Joe', '2016-08-30 09:00:00') 
,('Alan', '2016-08-30 08:45:00') 
,('John', '2016-08-30 09:02:00') 
,('Steven', '2016-08-30 07:30:00') 
,('Joe', '2016-08-30 11:00:00') 
,('Mike', '2016-08-30 17:30:00') 
,('Joe', '2016-08-30 12:00:00') 

Abfrage

SELECT 
DataTableID 
,[User] 
,EventTime 
,ROW_NUMBER() OVER(PARTITION BY [User] ORDER BY EventTime) Status 
FROM #DataTable 
WHERE CONVERT(DATE,EventTime) = CONVERT(DATE, SYSDATETIME()) 
ORDER BY DataTableID 

Ausgabe

DataTableID User EventTime    Status 
1   Joe  2016-08-30 09:00:00.000 1 
2   Alan 2016-08-30 08:45:00.000 1 
3   John 2016-08-30 09:02:00.000 1 
4   Steven 2016-08-30 07:30:00.000 1 
5   Joe  2016-08-30 11:00:00.000 2 
6   Mike 2016-08-30 17:30:00.000 1 
7   Joe  2016-08-30 12:00:00.000 3 
+0

danke für die Antwort, ich werde mich jetzt durch diesen Weg arbeiten und zurück zu dir in Kürze – Crezzer7

+0

, die den Trick! Vielen Dank für Ihre Hilfe. Beim nächsten Mal sollten Sie der Frage sofort weitere Details hinzufügen, um Verwirrung zu vermeiden! – Crezzer7

+0

Gerne helfen. Mehr Klarheit über die ursprüngliche Frage würde beim nächsten Mal die Downstimmen (von anderen) wahrscheinlich vermeiden. Wir leben und lernen aber :) –

1

Etwas wie:

select *, row_number() over(partition by user, cast(eventtime as date) order by eventtime) as status 
from datatable 

sollte es tun.

Allerdings würde ich vorschlagen, eine berechnete Spalte als Cast (eventtime als Datum), und Compound-Index für diese und Benutzer-Spalte und die ursprüngliche Eventtime-Spalte auch aus Gründen der Leistung zu erstellen.

Verwandte Themen