Sqlite3 медиана с группировкой по 2 колонкам смещает подзапрос - PullRequest
0 голосов
/ 06 сентября 2018

Я использую sqlite3 и пытаюсь получить среднее значение для разных групп. В настоящее время я использую следующий запрос

with data as (
select
t1.Name,
t1.Direction,
t1.Time a,
t2.Time b
from
cart t1 join cart t2 on t1.Time < t2.Time and t1.Name = t2.Name and t1.Direction = t2.Direction)
select Name, Direction, (a+b)/2.0 val from data order by Name, Direction, val

Что выводит следующее:

"Name"  "Direction" "val"
"asdf"  "w"         "1.5"
"asdf"  "w"         "2.0"
"asdf"  "w"         "2.5"
"asdf"  "z"         "3.5"
"asdf"  "z"         "4.0"
"asdf"  "z"         "4.5"
"fdas"  "w"         "7.5"
"fdas"  "w"         "8.0"
"fdas"  "w"         "8.5"
"fdas"  "z"         "5.5"
"fdas"  "z"         "6.0"
"fdas"  "z"         "6.5"

С этого момента я хотел бы найти медианное значение всех уникальных пар Имя / Направление.

Ожидаемый результат:

Name Direction Val
asdf w         2.0
asdf z         4.0
fdas w         8.0
fdas z         6.0

Или, если это облегчит задачу, Имя и Направление также можно объединить в один уникальный идентификатор со следующим выводом

Name   Val
asdfw  2.0
asdfz  4.0
fdasw  8.0
fdasz  6.0

Исходные данные таблицы следующие:

"Name"  "Direction" "Time"
"fdas"  "w" "8"
"fdas"  "w" "9"
"fdas"  "w" "7"
"fdas"  "z" "7"
"fdas"  "z" "6"
"fdas"  "z" "5"
"asdf"  "z" "5"
"asdf"  "z" "4"
"asdf"  "z" "3"
"asdf"  "w" "3"
"asdf"  "w" "2"
"asdf"  "w" "1"

Обновление

Я стал ближе к следующему запросу. Единственная оставшаяся проблема - найти требуемый запрос смещения. В настоящее время я жестко запрограммирован со следующим offset 3, но мне нужно получить центральный ряд. Я пробовал (select idx from calcs where data2.Name = calcs.Name and data2.Direction = calcs.Direction), но затем я получаю эту ошибку no such table: calcs: with data2.

with data2 as (
with data as (
select
t1.Name,
t1.Direction,
t1.Time a,
t2.Time b
from
cart t1 join cart t2 on t1.Time < t2.Time and t1.Name = t2.Name and t1.Direction = t2.Direction)
select Name, Direction, (a+b)/2.0 c from data order by Name, Direction, c
) select
    Name,
    Direction,
    (select c from
        (select c from data2 where data2.Name = calcs.Name and data2.Direction = calcs.Direction
            order by c
            limit 1
            offset 2 ) subset
    order by subset.c) tt
from
(select Name, Direction, round(COUNT(*)/2.0) idx from data2 group by Name, Direction) calcs

1 Ответ

0 голосов
/ 06 сентября 2018

используйте другой подзапрос

with data as (
select
t1.Name,
t1.Direction,
t1.Time a,
t2.Time b
from
cart t1 join cart t2 
on t1.Time < t2.Time and t1.Name = t2.Name 
and t1.Direction = t2.Direction
),
data2 as 
  (
 select Name, Direction, 
 (a+b)/2.0 as val 
 from data 
 order by Name, Direction, val
  ) select Name,Direction,avg(val) as mdval from data2 group by 
  Name,Direction

Или просто используйте агрегирование во втором запросе

with data as (
select
t1.Name,
t1.Direction,
t1.Time a,
t2.Time b
from
cart t1 join cart t2 on t1.Time < t2.Time and t1.Name = t2.Name and t1.Direction = t2.Direction
)
select Name, Direction, avg((a+b)/2.0) as val
from data group by Name, Direction
order by Name, Direction, val
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...