Как эффективно запросить первую строку? - PullRequest
0 голосов
/ 07 марта 2019

У меня есть таблица с большим количеством записей:

date          instrument    price
2019.03.07    X             1.1
2019.03.07    X             1.0
2019.03.07    X             1.2
...

Когда я запрашиваю цену открытия дня, я использую:

1 sublist select from prices where date = 2019.03.07, instrument = `X

Выполнение занимает много времени, потому что он выбирает все цены в этот день и получает первую.

Я тоже пробовал:

select from prices where date = 2019.03.07, instrument = `X, i = 0        //It does not return any record (why?)
select from prices where date = 2019.03.07, instrument = `X, i = first i  //Seem to work. Does it?

В Oracle эквивалент будет:

select * from prices where date = to_date(...) and instrument = "X" and rownum = 1

и Oracle немедленно остановится, когда найдет первую запись.

Как это сделать в KDB (например, немедленно остановить после того, как он найдет первую запись)?

Ответы [ 3 ]

3 голосов
/ 07 марта 2019

В kdb, подпункты where в операторах select выполняются последовательно.т.е. только те записи, которые проходят первый «тест», передаются второму тесту.Имея это в виду, глядя на ваши две попытки:

select from prices where date = 2019.03.07, instrument = `X, i = 0        //It does not return any record (why?)

Это ничего не (обязательно) возвращает, потому что к моменту проверки i=0 вы уже отфильтровали некоторыезаписи (возможно, включая первую запись в исходной таблице, которая будет иметь i=0)

select from prices where date = 2019.03.07, instrument = `X, i = first i  //Seem to work. Does it?

Эта должна работать.Сначала вы фильтруете по дате.Затем в записях на эту дату вы выбираете записи для инструмента `X.Затем в этих записях вы берете запись, где i - это first i (где i уже отфильтровано, поэтому first i - это просто индекс первой записи [все ещеиндекс из исходной таблицы, а не отфильтрованная версия])

0 голосов
/ 07 марта 2019

Q-SQL эквивалентом для этого является select [n] , который также работает лучше, чем другие подходы в большинстве случаев. Положительный 'n' даст первые n записей, а отрицательный даст последние n записей.

q) select[1] from prices where date = 2019.03.07, instrument = `X

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

0 голосов
/ 07 марта 2019

Вы можете использовать лимитную часть запросов MySQL. По сути, он ограничивает число, которое вы ставите в точке ограничения, и захватывает первое, если вы устанавливаете ограничение в 1. I.E

select from prices where date = 2019.03.07, instrument = `X, limit 1
...