2017-05-08 5 views
1

Ich habe eine Tabelle in Big Query mit eindeutigen IDs, Zeitstempel und Entfernungen und möchte einen Datensatz nach ID mit dem neuesten Zeitstempel auswählen.Wählen Sie eine pro eindeutige ID mit dem neuesten Zeitstempel

z. der Tisch sieht aus wie

ID|timestamp|distance 
A|100|2 
A|90|3 
B|110|5 
D|100|4 
A|80|2 
B|10|2 

Die Abfrage sollte wie etwas zurückgeben:

A|100|2 
B|110|5 
D|100|4 

Eine Arbeits Abfrage in PostgreSQL so aussieht, aber es gibt keine "distinct ON" in BigQuery? Hier

SELECT * FROM (
SELECT DISTINCT ON (ID) 
id, timestamp, distance 
FROM ranking 
ORDER BY ID, timestamp DESC 
) AS latest_dtg 
ORDER BY distance 

Antwort

0

Was ist mit diesem?

SELECT a.* 
FROM yourtable AS a 
INNER JOIN (
SELECT id, MAX(timestamp) AS newesttimestamp 
FROM yourtable 
GROUP BY id 
) AS b 
ON a.id = b.id AND a.timestamp = b.newesttimestamp 
ORDER BY a.id 
1

ist eine Idee:

#standardSQL 
WITH ranking AS 
(SELECT 'A' id, 100 ts, 2 distance UNION ALL 
SELECT 'A', 90, 3 UNION ALL 
SELECT 'B', 110, 5 UNION ALL 
SELECT 'D', 100, 4 UNION ALL 
SELECT 'B', 10, 2 UNION ALL 
SELECT 'A', 80, 2) 
SELECT id, ARRAY_AGG(STRUCT(ts, distance) ORDER BY ts DESC LIMIT 1)[SAFE_OFFSET(0)] 
FROM ranking 
GROUP BY id 
2

Unten ist für BigQuery Standard-SQL

#standardSQL 
SELECT row.* FROM (
    SELECT ARRAY_AGG(r ORDER BY timestamp DESC LIMIT 1)[OFFSET(0)] AS row 
    FROM ranking AS r 
    GROUP BY id 
) 

Sie können spielen/Test mit folgenden Dummy-Daten aus Ihrer Frage

#standardSQL 
WITH ranking AS (
    SELECT 'A' AS id, 100 AS timestamp, 2 AS distance UNION ALL 
    SELECT 'A', 90, 3 UNION ALL 
    SELECT 'B', 110, 5 UNION ALL 
    SELECT 'D', 100, 4 UNION ALL 
    SELECT 'B', 10, 2 UNION ALL 
    SELECT 'A', 80, 2 
) 
SELECT row.* FROM (
    SELECT ARRAY_AGG(r ORDER BY timestamp DESC LIMIT 1)[OFFSET(0)] AS row 
    FROM ranking AS r 
    GROUP BY id 
) 
Verwandte Themen