Jak uzyskać pierwszy i ostatni wiersz w każdym dniu dla każdego deviceid?

0

Witam,
Proszę Was o pomoc w jaki sposób uzyskać pierwszy i ostatni wiersz z każdego dnia dla każdego deviceid? Zamieszczam przykład bazy jaką posiadam:
http://sqlfiddle.com/#!17/9e2c78/1

Z góry dziękuję za pomoc.

0

Group by, min, max

0

Rozumiem tylko dni w docelowej bazie mam kilkaset i min/max zwróci dwie wartości, a nie po dwie na każdy dzień.

0

Dostaję info, że funkcje agregujące są niedopuszczalne w GROUP BY

MIN i MAX użyj w SELECT a nie w GROUP BY.

0
 SELECT deviceid, min(ts), max(ts) FROM device_data group by deviceid

http://sqlfiddle.com/#!17/9e2c78/112

0

Witam, dziękuję za odpowiedź ale jednak nie do końca o to mi chodzi. Chcę uzyskać z każdego dnia pierwszy i ostatni wiersz dla każdego deviceid. Na moim przykładzie select powinien zwrócić:

(123, '20171205 0200', 500000),
(123, '20171205 0900', 570000),
(123, '20171206 0100', 580000),
(123, '20171206 0800', 650000),
(456, '20171205 0100', 800000),
(456, '20171205 0700', 860000),
(456, '20171206 0800', 870000),
(456, '20171206 0800', 950000)

0
 select deviceid,ts,totaldistance from (
 select 
 row_number() over (partition by deviceid, ts::date order by ts) rf,
 row_number() over (partition by deviceid, ts::date order by ts desc) rl
 ,* from
 device_data) ddata
 where rf=1 or rl=1
 order by 1,2

http://sqlfiddle.com/#!17/9e2c78/142

tylko nie da się tego zrobic jak ty chcesz, bo ts nie determinuje kolejności, albo nie da się jednoznacznie jej określić, bo dla deviceid = 456 i daty 2017-12-06 0800 masz 2 wartości:870000 i 950000

0
SELECT deviceid, ts::date, MIN(ts), MAX(ts), min(totaldistance), max(totaldistance) FROM device_data GROUP BY deviceid, ts::date

http://sqlfiddle.com/#!17/9e2c78/148/0

1 użytkowników online, w tym zalogowanych: 0, gości: 1