У меня есть секционированная таблица, похожая на таблицу ниже:
q)t:([]date:3#2019.01.01; a:1 2 3; a_test:2 3 4; b_test:3 4 5; c: 6 7 8);
date a a_test b_test c
----------------------------
2019.01.01 1 2 3 6
2019.01.01 2 3 4 7
2019.01.01 3 4 5 8
Теперь я хочу получить столбец даты, и все столбцы имеют имена с суффиксом "_test" из таблицы t.
Ожидаемый результат:
date a_test b_test
------------------------
2019.01.01 2 3
2019.01.01 3 4
2019.01.01 4 5
В моей исходной таблице более 100 столбцов с именем, имеющим _test, поэтому приведенное ниже не является практическим решением в этом случае.
q)select date, a_test, b_test from t where date=2019.01.01
Я пробовал различные варианты, как показано ниже, но безрезультатно:
q)delete all except date, *_test from select from t where date=2019.01.01
2 ответа
Если столбцы, которые вы выбираете, являются переменными, вы должны использовать функциональный оператор qSQL для выполнить запрос. Следующее может быть использовано в вашем случае
q)query:{[tab;dt;c]?[tab;enlist (=;`date;dt);0b;(`date,c)!`date,c]}
q)query[t;2019.01.01;cols[t] where cols[t] like "*_*"]
date a_test b_test
------------------------
2019.01.01 2 3
2019.01.01 3 4
2019.01.01 4 5
Чтобы составить конкретный функциональный оператор, вы можете проанализировать ваш запрос, разместив пустые столбцы, если вы не уверены, какими они должны быть.
q)parse "select date,c1,c2 from tab where date=dt"
?
`tab
,,(=;`date;`dt)
0b
`date`c1`c2!`date`c1`c2
Функциональный выбор, вероятно, является лучшим способом, если вам нужно добавить дополнительные фильтры.
?[`t;();0b;{x!x}`date,exec c from meta t where c like "*_test"]
Функциональную форму любого выбранного квеста можно получить с помощью -5! оператор любого оператора в стиле SQL. В приведенном ниже примере я создал таблицу с 20 полями, каждое из которых начинается с a или b. Затем я использую функциональную форму, чтобы определить, какие поля я хочу.
q)tab:{[x] enlist x!count[x]#0}`$"_" sv ' raze string `a`b,/:\:til 10
q){[t;s]?[t;();0b;{[x] x!x} cols[t] where cols[t] like s]}[tab;"b*"]
b_0 b_1 b_2 b_3 b_4 b_5 b_6 b_7 b_8 b_9
---------------------------------------
0 0 0 0 0 0 0 0 0 0
q){[t;s]?[t;();0b;{[x] x!x} cols[t] where cols[t] like s]}[tab;"a*"]
a_0 a_1 a_2 a_3 a_4 a_5 a_6 a_7 a_8 a_9
---------------------------------------
0 0 0 0 0 0 0 0 0 0
q)-5!" select a,b from c"
?
`c
()
0b
`a`b!`a`b
В качестве альтернативы, если мне не нужна фильтрация, я могу использовать оператор #, как показано ниже:
{[x;s] (cols[x] where cols[x] like s)#x}[ tab;"a*"]
Похожие вопросы
Новые вопросы
kdb
kdb + - это собственная высокопроизводительная база данных, разработанная Kx Systems.