Запрос KDB / Q для критериев соответствия строк в месяц - PullRequest
2 голосов
/ 18 июня 2019

Я хотел бы выполнить запрос в Q / KDB, который извлекает строки, удовлетворяющие следующим критериям.

  1. Строки с тем же именем за месяц должны быть только отмечены.
  2. Имена должны быть различны, т. Е. Если они удовлетворяют условию 1, они должны появляться только в виде единственной записи.

Исходная таблица:

completed name month
--------------------
yes       x    1    
no        x    1    
yes       y    2
yes       y    2    
no        a    3    
yes       a    4    
yes       b    4    
no        b    4    
no        b    4  
yes       y    5

Исходная таблица, разделенная на месяцы

completed name month
--------------------
yes       x    1    
no        x    1
---------------------    
yes       y    2
yes       y    2    
--------------------
no        a    3    
--------------------
yes       a    4    
yes       b    4    
no        b    4    
no        b    4  
--------------------
yes       y    5

Таблица результатов:

completed name month
--------------------
yes       y    2    
yes       a    4 
yes       y    5   

Пояснение:

  1. В месяце 1 , совершено только x , но еще не завершено ни одной сделки, следовательно, ее нет в нашем финальном столе.

  2. В месяце 2 , только y , совершенных с обеими сделками, и, следовательно, это в нашей финальной таблице.

  3. В месяц 3 , совершено только a , но сделка не завершена.

  4. В месяце 4 , оба a и b совершены сделки, но поскольку b имеет незавершенные сделки, оно остается вне.

  5. В месяце 5 , только y проведено транзакций, поэтому оно добавляется в финальную таблицу.

Ответы [ 3 ]

4 голосов
/ 18 июня 2019

Привет Carrein, вы можете использовать следующее, используя каждое правильное наречие и фильтр fby

distinct select from tab where ({all`yes=/:x};completed)fby([]name;month)

Кроме того, вы можете использовать логический вектор для заполненного столбца для простоты

1 голос
/ 18 июня 2019

Вероятно, не самый правильный ответ, но, по крайней мере, он работает:

t: ([]completed:`yes`no`yes`yes`no`yes`yes`no`no`yes; name:`x`x`y`y`a`a`b`b`b`y;month:1 1 2 2 3 4 4 4 4 5)

(cols t) xcols `month xasc ungroup {select from x where all each completed = `yes} select distinct completed by name,month from t

completed name month
--------------------
yes       y    2    
yes       a    4    
yes       y    5    
0 голосов
/ 14 июля 2019

Если вы используете DolphinDB вместо kdb +, решение будет более читабельным.

tbl = table(1 0 1 1 0 1 1 0 0 1 as completed, `x`x`y`y`a`a`b`b`b`y as name, 1 1 2 2 3 4 4 4 4 5 as month)
select top 1 * from tbl context by month, name having min(completed)=1

completed name month
--------- ---- -----
1         y    2
1         a    4
1         y    5

Предложение context by в выражении sql похоже на group by. Но это не требует, чтобы все столбцы в предложении select были агрегированными значениями. Кроме того, он может работать вместе с предложением having для фильтрации групп. Предложение top n применяется к каждой группе.

...