2016-10-31 2 views
2

Предположим, у меня есть таблица с датой, символом и размером в виде столбцов. Даты в порядке возрастания и размеры в порядке убывания для каждой даты. Как я сокращаю таблицу, так что каждая дата, только верхняя часть, скажем 10, хранится? Чем проще команда, тем лучше.Вывести верхние записи по дате с помощью kdb

Заранее благодарен!

ответ

3

Учитывая таблица:

q)show tbl:`date`val!/:(.z.d+til 3) cross 100+til 25; 
    date  val 
    -------------- 
    2016.10.31 100 
    2016.10.31 101 
    2016.10.31 102 
    2016.10.31 103 
    2016.10.31 104 
    .. 

Выбрать первые N строк по дате: (N = 2 в примере ниже)

q)select from tbl where i in{raze y sublist/:group x}[date;2] 
    date  val 
    -------------- 
    2016.10.31 100 
    2016.10.31 101 
    2016.11.01 100 
    2016.11.01 101 
    2016.11.02 100 
    2016.11.02 101 

Использует group функцию - которая возвращает словарь, содержащий индексы, где каждый происходит уникальное значение. Затем функция извлекает первые N индексов (sublist) для каждого уникального значения.

NB: i - неявный индекс строки в таблице kdb.

0

«fby» также является хорошим вариантом и обычно используется в тех случаях, когда требуется операция/агрегация по группе.

http://code.kx.com/q/ref/qsql/#fby

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

q) select from tbl where ({x in 10#x};i) fby date