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.
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.
Group by, min, max
Rozumiem tylko dni w docelowej bazie mam kilkaset i min/max zwróci dwie wartości, a nie po dwie na każdy dzień.
Dostaję info, że funkcje agregujące są niedopuszczalne w GROUP BY
MIN
i MAX
użyj w SELECT
a nie w GROUP BY
.
SELECT deviceid, min(ts), max(ts) FROM device_data group by deviceid
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)
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
SELECT deviceid, ts::date, MIN(ts), MAX(ts), min(totaldistance), max(totaldistance) FROM device_data GROUP BY deviceid, ts::date