Как выбрать столбец, содержащий точку в имени столбца в KDB - PullRequest
1 голос
/ 30 октября 2019

У меня есть таблица, которая состоит из столбца с именем "ab"

q)t:([]a.b:3?10.0; c:3?10; d:3?`3)

Как мы можем выбрать столбцы ab и c из таблицы t?
Как мы можем переименовать столбец ab в b?
Можно ли достичь двух вышеупомянутых случаев без функционального выбора?

Failed attempts:
q)select a.b, c from t
'type
q)?[`t;();0b;enlist (`b`c!`a.b`c)]
'type
q)select b:a.b from t
'type

Ответы [ 4 ]

4 голосов
/ 30 октября 2019

Как уже упоминалось, .Q.id t будет очищать имена столбцов таблицы, если они не подходят для операторов qSQL или производительности в целом.

 `a.b`c#t 

будет работать только для выбора нескольких столбцов и

 `a.b#t 

вернет ошибку типа. Тем не менее, вы можете обойти это, включив один элемент в оператор take, например:

q)enlist[`a.b]#t
a.b
---------
4.931835
5.785203
0.8388858
q)(enlist`a.b)#t
a.b
---------
4.931835
5.785203
0.8388858

Если вам нужны только значения из одного столбца, другой вариант будет использовать индексацию, в этом случае, это будет t[ ab] `, который будет возвращать все значения из столбца ab.

Вы также можете смешивать эти стили выделения вот так, но в конечном итоге потеряете имя столбца из ab:

q)select c,t[`a.b] from t
c x
----------
8 4.707883
5 6.346716
4 9.672398

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

2 голосов
/ 30 октября 2019

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

Основная причина возникновения ошибок состоит в том, что использование точечной нотации в qSQL зарезервировано для разрешения связанных столбцов . Мы можем увидеть, как это на самом деле работает, проанализировав сам запрос

q)parse "select a.b from tab"
?
`tab
()
0b
(,`b)!,`a.b // Here the referencing of a linked column b via a is occuring

// Compared to a normal select
q)parse "select b from tab"
?
`tab
()
0b
(,`b)!,`b

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

Использование точечной нотации в именах столбцов затруднит дальнейшее развитие и заставит всех остальных пользователей kdb использовать обходные методы. Развитие будет медленным и столкнется со многими ошибками.

Я бы посоветовал, если в столбец необходимо включить периоды, вы создадите API для внешних пользователей, чтобы использовать его для перевода запросов в очищенные формы.

Вы можете легко дезинфицировать всю таблицу с помощью .Q.id

q)tab:enlist `a.b`c`d!(1 2 3)
q)tab:.Q.id tab
q)sel:{[tab;cl] ?[tab;();0b;((),.Q.id each cl)!((),.Q.id each cl)]}
q)sel[tab;`a.b]
ab
--
1
2 голосов
/ 30 октября 2019

Как насчет следующего, используя take #:

q) `a.b`c#t

a.b       c
-----------
4.931835  1
5.785203  9
0.8388858 5

Чтобы переименовать:

q) `b xcol t

b         c d  
---------------
4.931835  1 mil
5.785203  9 igf
0.8388858 5 kao
1 голос
/ 30 октября 2019

Вы можете использовать .Q.id для переименования любых невыбираемых столбцов:

q).Q.id t
ab        c d
---------------
4.931835  1 mil
5.785203  9 igf
0.8388858 5 kao

Лучше всего избегать точек в именах и символах столбцов в целом, используйте подчеркивание, если необходимо.

...