2016-04-20 7 views
1

Ich habe eine Tabelle, die wie folgt strukturiert:Graf und Name Inhalt aus einer SQL Server-Tabelle

+-----+-------------+-------------------------+ 
| id | name  |  timestamp  | 
+-----+-------------+-------------------------+ 
| 1 | someName | 2016-04-20 09:41:41.213 | 
| 2 | someName | 2016-04-20 09:42:41.213 | 
| 3 | anotherName | 2016-04-20 09:43:41.213 | 
| ... | ...   | ...      | 
+-----+-------------+-------------------------+ 

Nun, ich versuche, eine Abfrage zu erstellen, die alle Zeitstempel seit der Zeit x wählt und die Menge zählt von Zeiten tritt derselbe Name im Ergebnis auf.

Als Beispiel, wenn wir diese Abfrage der obigen Tabelle gelten würde, mit 2016-04-20 09:40:41.213 als das Datum, von dem an sie gezählt werden soll, sollte das Ergebnis wie folgt aussehen:

+-------------+-------+ 
| name  | count | 
+-------------+-------+ 
| someName |  2 | 
| anotherName |  1 | 
+-------------+-------+ 

Was habe ich erreicht Bisher ist die folgende Abfrage, die mir die Namen gibt, aber nicht ihre Zahl:

WITH screenshots AS 
(
    SELECT * FROM SavedScreenshotsLog 
    WHERE timestamp > '2016-04-20 09:40:241.213' 
) 
SELECT s.name 
FROM SavedScreenshotsLog s 
INNER JOIN screenshots sc ON sc.name = s.name AND sc.timestamp = s.timestamp 
ORDER BY s.name 

ich habe durch Stackoverflow durchsucht, war aber nicht in der Lage, eine Lösung zu finden, die meine Bedürfnisse passen und wie ich bin nicht sehr erfahren Mit SQL habe ich keine Ideen mehr.

Antwort

7

Sie erwähnen eine Tabelle in Ihrer Frage und zeigen dann eine Abfrage mit zwei Tabellen an. Das macht es schwierig, der Frage zu folgen.

Was Sie fordern ist eine einfache Aggregation:

SELECT name, COUNT(*) 
FROM SavedScreenshotsLog 
WHERE timestamp > '2016-04-20 09:40:241.213' 
GROUP BY name 
ORDER BY COUNT(*) DESC; 

EDIT:

Wenn Sie "0" Werte möchten, können Sie bedingte Aggregation verwenden:

SELECT name, 
     SUM(CASE WHEN timestamp > '2016-04-20 09:40:241.213' THEN 1 ELSE 0 END) as cnt 
FROM SavedScreenshotsLog 
GROUP BY name 
ORDER BY cnt DESC; 

Beachten Sie, dass Dies wird langsamer ausgeführt, da für die Daten vor der Aggregation kein Filter vorhanden ist.

+0

Ich hatte die gleiche Idee, wurde aber auch durch den Wortlaut der Frage abgeworfen. – Yuck

+0

Wow, viel einfacher als ich es erwartet hatte. Ich denke, ich habe es ein wenig übertrieben, danke! – Marv

+0

Gibt es eine einfache Möglichkeit, "0" -Werte von "COUNT" in das Ergebnis aufzunehmen? – Marv

2
CREATE TABLE #TEST (name varchar(100), dt datetime) 

INSERT INTO #TEST VALUES ('someName','2016-04-20 09:41:41.213') 
INSERT INTO #TEST VALUES ('someName','2016-04-20 09:41:41.213') 
INSERT INTO #TEST VALUES ('anotherName','2016-04-20 09:43:41.213') 

declare @YourDatetime datetime = '2016-04-20 09:41:41.213' 
SELECT name, count(dt) 
FROM #TEST 
WHERE dt >= @YourDatetime 
GROUP BY name 

Ich habe die Antwort geschrieben, weil die obige Abfrage Fehler erzeugen kann die Zeichenfolge in where-Klausel in eine Datetime bei der Umwandlung, es hängt von dem Format des Datetime.

+0

abgesehen von Tabelle Variable diese Abfrage wird von Gordon Linoff aufgehoben Antwort – mohan111

+0

Versuchen Sie, Ihre Standard-Datetime-Format zu ändern und wenden Sie die Abfrage wird es nicht funktionieren. Ich habe den Grund hinzugefügt, warum ich die Antwort gepostet habe. Natürlich ist es fast dasselbe wie die obige Antwort, es ist eine sehr einfache Abfrage, die Sie nicht viele Best-Practice-Antworten haben können. – CiucaS