wake-up-neo.com

SELECT DISTINCT in einer Spalte, mehrere andere Spalten zurückgeben (SQL Server)

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?

17
mwalsher
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
15
Hogan
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 
24
Howie

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.

2
artdanil

versuchen:

   Select r.*   
   From GPSReport r
   Where datetime =
        (Select Max(DateTime)
         From GPSReport 
         Where device_serial = r.device_serial)
1
Charles Bretana

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
1
Bliek

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

1
Ray

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

0
Sourav Kundu

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
0
mn128b