как удалить избыточное использование последнего ключевого слова в qsql - PullRequest
0 голосов
/ 07 октября 2019

У меня есть таблица:

q)t:([] sym:`AAPL`MSFT`AMZN`AAPL`MSFT`AMZN; px:1 2 3 11 22 33; sh:100 200 300 1000 2000 3000)

Я хочу получить последние px и sh по sym, которые можно получить с помощью последней функции два раза:

q)select last px, last sh by sym from t
sym | px sh
----| -------
AAPL| 11 1000
AMZN| 33 3000
MSFT| 22 2000

Как мы можемиспользовать последнее ключевое слово только один раз, чтобы получить результат выше? (потому что в практических случаях иногда нам нужно использовать последний для более чем 30 столбцов)

Мои неудачные попытки:

q)select last (px;sh) by sym from t
q)select {last x}@'(px;sh) by sym from t

Ответы [ 2 ]

6 голосов
/ 07 октября 2019

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

select by sym from t

Следует выполнить трюк

q)(select last px, last sh by sym from t)~select by sym from t
1b
2 голосов
/ 07 октября 2019

Распространенным подходом к проблеме является использование fby, которое позволяет применять такую ​​функцию, как first или last (или лямбда) ко всем столбцам:

t:([]c1:10?`A`B`C;c2:10?10;c3:10?"xyz";c4:.z.D-til 10)

q)select from t where i=(last;i)fby c1
c1 c2 c3 c4
-------------------
A  9  z  2019.10.01
C  7  y  2019.09.29
B  0  x  2019.09.28

q)select from t where i=({first x};i)fby c1
c1 c2 c3 c4
-------------------
B  6  x  2019.10.07
C  6  x  2019.10.06
A  4  y  2019.10.02

ДляЧтобы ответить на ваш вопрос в комментарии, касающемся применения другой функции к столбцу, вы должны будете использовать функциональный выбор, например:

q)?[t;();{x!x}1#`c1;{x!((first;last)x in `c2`c4),'x}cols[t]except`c1]
c1| c2 c3 c4
--| ----------------
A | 9  y  2019.10.01
B | 0  x  2019.09.28
C | 7  x  2019.09.29

При этом используется last для столбцов c2 и c4, затем используется firstдля других столбцов

...