Ich versuche, eine Abfrage zu schreiben, die die letzten GPS-Positionen aus einer GPSReport-Tabelle für jedes einzelne Gerät zurückgibt. Die Tabelle enthält 50 Geräte. Ich möchte nur, dass 50 Zeilen zurückgegeben werden.
Hier ist was ich bis jetzt habe (funktioniert nicht)
SELECT TOP(SELECT COUNT(DISTINCT device_serial) FROM GPSReport) * FROM GPSReport AS G1
RIGHT JOIN
(SELECT DISTINCT device_serial FROM GPSReport) AS G2
ON G2.device_serial = G1.device_serial
ORDER BY G2.device_serial, G1.datetime DESC
Dies gibt 50 Zeilen zurück, gibt jedoch keine eindeutige Zeile für jedes device_serial zurück. Es werden alle Berichte für das erste Gerät und dann alle Berichte für das zweite Gerät usw. zurückgegeben.
Ist das, was ich versuche, in einer Abfrage möglich?
SELECT * FROM
GPSReport AS G1
JOIN (SELECT device_serial, max(datetime) as mostrecent
FROM GPSReport group by device_serial) AS G2
ON G2.device_serial = G1.device_serial and g2.mostrecent = g1.datetime
ORDER BY G1.device_serial
WITH DEDUPE AS (
SELECT *
, ROW_NUMBER() OVER ( PARTITION BY what_you_want_for_distinct ORDER BY what_you_want_for_distinct) AS OCCURENCE
FROM tablename
)
SELECT * FROM DEDUPE
WHERE
OCCURENCE = 1
Wenn Sie mehr als einen Datensatz für die Seriennummer des Geräts in der Tabelle GPSReport
haben, werden alle diese Datensätze und Verbindungen an die eindeutige Liste von SELECT DISTINCT device_serial FROM GPSReport
übergeben.
versuchen:
Select r.*
From GPSReport r
Where datetime =
(Select Max(DateTime)
From GPSReport
Where device_serial = r.device_serial)
Ich würde es mit einem Common Table Expression (CTE) so machen:
With ResultTable (RowNumber
,device_serial
,datetime
,triggerID
,latitude
,longitude
,speed
,address)
AS
(
SELECT Row_Number() OVER (PARTITION BY device_serial
ORDER BY datetime DESC)
,device_serial
,datetime
,triggerID
,latitude
,longitude
,speed
,address
FROM GPSReport
)
SELECT device_serial
,datetime
,triggerID
,latitude
,longitude
,speed
,address
FROM ResultTable
WHERE RowNumber = 1
Wie wäre es mit so etwas - da ich es nicht ausführen konnte, erwarte ich, dass mein Synatx nicht perfekt ist
select *
from (
select device_serial, [datetime], triggerID, latitude, longitude, speed, [address],
ROW_NUMBER() over (partition by device_serial order by device_serial asc, [datetime] desc) as row
from gpsreport
) as data
where row = 1
Möglicherweise müssen Sie die order by-Klausel ändern, um den bevorzugten Datensatz auszuwählen, wenn mehrere mit demselben device_serial und derselben datetime vorhanden sind
Dies ist das Endergebnis, das nicht eindeutig verwendet wird, da dies die neue Abfrage ist, deren Hilfe für alle " select * FROM tbl GROUP BY-Bandsupported " gilt. Seine Arbeit ist identisch mit einem bestimmten und alle Zeilen erhalten
Ich fand dieses erstaunliche Ergebnis, nachdem ich jede mögliche Antwort auf StackOverFlow ausprobiert hatte
WITH cte AS /* Declaring a new table named 'cte' to be a clone of your table */
(SELECT *, ROW_NUMBER() OVER (PARTITION BY id ORDER BY val1 DESC) AS rn
FROM MyTable /* Selecting only unique values based on the "id" field */
)
SELECT * /* Here you can specify several columns to retrieve */
FROM cte
WHERE rn = 1