2013-06-21 4 views
4

Я хочу выбрать максимум элементов из таблицы в течение следующих 5, 10, 30 минут и т. Д. Я подозреваю, что это невозможно с несколькими элементами в предложении where. Использование обоих нормальных < и </: не работает. Мой код/​​запрос ниже:Как использовать несколько аргументов в kdb, где запрос?

`select max price from dat where time</: (09:05:00; 09:10:00; 09:30:00)` 

Любые идеи, что я делаю неправильно здесь? Идея состоит в том, чтобы получить максимальную цену за каждую строку в течение следующих 5, 10, 30 ... минут времени в этой строке, а не только 3 максимальных цены во всей таблице.

select max price from dat where time</: time+\:(5 10 30) 

Это не сработает, но должно дать общую идею.

Чтобы уточнить, я хочу рассчитать максимальную цену в 5, 10, 30-минутных интервалах от времени [i] каждой строки таблицы. Таким образом, для каждой таблицы максимальная цена в пределах x + 5, x + 10, x + 30 минут, где x - это запись времени в этой строке.

ответ

0

Это работает, но занимает много времени. За 20 тыс. Записей, ~ 20 секунд, слишком много !. Любой способ сделать это быстрее

dat: update tmlst: time+\:mtf*60 from dat; 
dat[`pxs]: {[x;y] {[x; ts] raze flip raze {[x;y] select min price from x where time<y}[x] each ts }[x; y`tmlst]} [dat] each dat; 
0

Вы могли бы попробовать что-то вроде этого:

select c1:max price[where time <09:05:00],c2:max price[where time <09:10:00],c3:max price from dat where time< 09:30:00 

Вы можете paramatize этот запрос, как вам нравится. Поэтому, если у вас есть список раз, l: 09: 05: 00 09:10:00 09:15:00 09:20:00 ... Вы можете создать функцию, используя функциональную форму запроса выше, чтобы работать для разная длина л, что-то вроде:

q)f:{[t]?[dat;enlist (<;`time;max t);0b;(`$"c",/:string til count t)!flip (max;flip (`price;flip (where;((<),/:`time,/:t))))]} 
q)f l 

Вы можете расширить п принимать различные функции вместо макс, работу для разных таблиц и т.д.

+0

Это именно то, чего я пытаюсь избежать. если я должен сделать для 5, 10, 20, 25, 30, 35 .... так далее, это решение не идеально –

+0

Ответ отредактирован. Такое же решение, но параметризуемое. – user1895961

+0

Что такое использование f? try f [(15 30 60 120)], он просто дает 4 значения в отдельных столбцах, а не то, что я ищу. –

0

это создает словарь шаг для отображения времен ваших ведер:

q)-1_select max price by(`s#{((neg w),x)!x,w:(type x)$0W}09:05:00 09:10:00 09:30:00)time from dat 

вы также можете быть в состоянии аЬ использование wj:

q)wj[{(prev x;x)}09:05:00 09:10:00 09:30:00;`time;([]time:09:05:00 09:10:00 09:30:00);(delete sym from dat;(max;`price))] 

, если все ваши ковши такого же размера, это намного проще:

q)select max price by 300 xbar time from dat where time<09:30:00/300-second (5-min) buckets 
+0

Опять же, ответ возвращает только постоянные ведра до 0930. Я хочу сделать это для всех строк в таблице. За каждый раз x, я хочу рассчитать максимальную цену после x + 5, x + 15, x + 30 ... минут. –