Объединить LAST с DISTINCT или GROUP BY? - PullRequest
0 голосов
/ 26 сентября 2019

У меня есть простой временной ряд, подобный этому:

time                    id         area
2019-09-25T17:21:00Z    1          us
2019-09-25T17:22:00Z    1          uk
2019-09-25T17:23:00Z    2          canada
2019-09-25T17:24:00Z    3          us
2019-09-25T17:25:00Z    1          canada

Я хочу получить подсчет областей для последней точки каждого отдельного идентификатора, поэтому результат должен быть примерно таким:

area      count        
us        1
canada    2

Поскольку последняя точка для идентификатора 1 - это Канада, я хочу игнорировать все предыдущие точки для идентификатора 1.

Как запросить только самую последнюю точку для каждого отдельного идентификатора?Возможно ли это?

Редактировать: Вот фактические данные, с которыми я работаю.

name: click3
time                area   id       value
----                ----   --       -----
1569480689926885700 travel session1 1
1569480693527591500 travel session2 1
1569480699951799900 vtc    session3 1
1569480706416720700 health session1 1
1569480713265800900 claim  session4 1
1569480719882312600 health session3 1

area и id действительно являются тегами.Когда я делаю простой select LAST(value) с GROUP BY, я получаю следующее:

> select last(value) as value, area, id from click3 group by id
name: click3
tags: id=session1
time                value area   id
----                ----- ----   --
1569480706416720700 1     health session1

name: click3
tags: id=session2
time                value area   id
----                ----- ----   --
1569480693527591500 1     travel session2

name: click3
tags: id=session3
time                value area   id
----                ----- ----   --
1569480719882312600 1     health session3

name: click3
tags: id=session4
time                value area  id
----                ----- ----  --
1569480713265800900 1     claim session4

, что правильно - последняя точка для каждого уникального идентификатора сеанса.Когда я select * from рассматриваю этот запрос как подзапрос, результат будет

> select * from (select last(value) as value, area, id from click3 group by id)
name: click3
time                area   id       id_1     value
----                ----   --       ----     -----
1569480693527591500 travel session2 session2 1
1569480706416720700 health session1 session1 1
1569480713265800900 claim  session4 session4 1
1569480719882312600 health session3 session3 1

Когда я добавляю агрегат, такой как COUNT (*) или SUM (значение), я вижу ожидаемое число 4:

> select count(*) from (select last(value) as value, area, id from click3 group by id)
name: click3
time count_value
---- -----------
0    4

Но если я затем добавлю GROUP BY area к этому запросу, я ожидаю, что путешествие будет иметь значение 1, здоровье будет иметь значение 2, и утверждают, что оно будет иметь значение 1. По какой-то причине,Похоже, что используется полный исходный набор точек данных, а не сокращенный набор из подзапроса, поэтому я в итоге получаю следующее:

> select count(*) from (select last(value) as value, area from click3 group by id) group by area
name: click3
tags: area=claim
time count_value
---- -----------
0    1

name: click3
tags: area=health
time count_value
---- -----------
0    2

name: click3
tags: area=travel
time count_value
---- -----------
0    2

name: click3
tags: area=vtc
time count_value
---- -----------
0    1

Я думаю, что у меня должно быть существенное недопонимание того, как работает effxdb.Чего мне не хватает?

1 Ответ

0 голосов
/ 26 сентября 2019

При условии, что id и area являются тегами, что-то вроде этого должно работать

select count(*) from (select last(*) from your_measurement group by id) group by area Вы можете заменить * только одним полем.Вложенный запрос получает последнюю точку данных для каждого идентификатора, из этих результатов внешний запрос делает подсчет для каждой области.В зависимости от вашего конкретного случая использования запрос может немного отличаться.

...