Запрос KDB / Q для строк, соответствующих смежным критериям? - PullRequest
1 голос
/ 20 июня 2019

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

Действительная партия транзакция должна соответствовать ряду критериев.

  1. Они должны быть из одного магазина.
  2. Они должны быть в конечном итоге завершены, то есть X сумма отмены, но 1 завершение.
  3. Ожидающие пакетные транзакции (отмененные и завершенные) не должны превышать определенного периода времени, например, 1 дня.
  4. Транзакции должны иметь одинаковую сумму денежных средств, помеченную как «та же» транзакция.
  5. Транзакции должны быть сгруппированы по дням, то есть любые ожидающие партии не должны рассматриваться как непрерывность на следующий день.
  6. Отмененные транзакции с суммой в десятки, т. Е. 10, 1000, 10000, должны игнорироваться.

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

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

shop amount status    date    
------------------------------
A    1234   Cancelled 20101010
A    1234   Cancelled 20101010
A    1234   Completed 20101010
A    1234   Cancelled 20101010
A    1234   Completed 20101011
A    1000   Completed 20101011
B    100    Cancelled 20101011
B    100    Cancelled 20101011
B    4321   Cancelled 20101011
B    4321   Cancelled 20101011
C    333    Cancelled 20101012
C    333    Completed 20101012
C    333    Completed 20101012
D    111    Cancelled 20101013
D    155    Cancelled 20101013
D    111    Completed 20101013
D    155    Completed 20101013

по дням:

shop amount status    date    
------------------------------
A    1234   Cancelled 20101010
A    1234   Cancelled 20101010
A    1234   Completed 20101010
A    1234   Cancelled 20101010
------------------------------
A    1234   Completed 20101011
A    1000   Completed 20101011
B    100    Cancelled 20101011
B    100    Cancelled 20101011
B    4321   Cancelled 20101011
B    4321   Cancelled 20101011
------------------------------
C    333    Cancelled 20101012
C    333    Completed 20101012
C    333    Completed 20101012
------------------------------
D    111    Cancelled 20101013
D    155    Cancelled 20101013
D    111    Completed 20101013
D    155    Completed 20101013

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

shop amount status    date     batch
-------------------------------------
A    1234   Cancelled 20101010   1
A    1234   Cancelled 20101010   1
A    1234   Completed 20101010   1
-------------------------------------
A    1234   Completed 20101011   2
A    1000   Completed 20101011   3
-------------------------------------
C    333    Cancelled 20101012   4
C    333    Completed 20101012   4
C    333    Completed 20101012   5
-------------------------------------
D    111    Cancelled 20101013   6
D    155    Cancelled 20101013   7
D    111    Completed 20101013   6
D    155    Completed 20101013   7

Запрос таблицы:

([] shop:`A`A`A`A`A`A`B`B`B`B`C`C`C`D`D`D`D; amount: 1234 1234 1234 1234 1234 1000 100 100 4321 4321 333 333 333 111 155 111 155; status:`Cancelled`Cancelled`Completed`Cancelled`Completed`Completed`Cancelled`Cancelled`Cancelled`Cancelled`Cancelled`Completed`Completed`Cancelled`Cancelled`Completed`Completed; date: `20101010`20101010`20101010`20101010`20101011`20101011`20101011`20101011`20101011`20101011`20101012`20101012`20101012`20101013`20101013`20101013`20101013)

Пояснение:

  1. В первый день A совершает 4 транзакции. Первые три сгруппированы вместе, так как они имеют одинаковое количество [отменено -> отменено -> выполнено] . Последняя транзакция игнорируется, так как это конец дня.

  2. Во второй день A совершает транзакцию с той же суммой 1234, но не принимает транзакцию предыдущего дня как часть своего пакета. A завершает другую транзакцию 1000. B совершают четыре транзакции, но они не отслеживаются, поскольку они a) отменены или b) полномочия десяти .

  3. На третий день C совершает три транзакции с одинаковой суммой. Это считается двумя партиями, поскольку первая отмена и завершение формируют начальную партию, а последняя завершенная транзакция является отдельной партией.

  4. На четвертый день D совершает четыре транзакции и формирует две партии. Обратите внимание, что транзакция здесь не является непрерывной, поскольку есть две отмененные транзакции с различной суммой, но обе они будут завершены в будущем.

Таблица упорядочена по метке времени и дате, то есть с 23:59:59 до 00:00:00. Запрос не обязательно должен быть однострочным и может быть многострочным написанием запроса в любую временную таблицу / переменную и т. Д.

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

Ответы [ 2 ]

7 голосов
/ 20 июня 2019

Итак, сначала посчитайте количество завершенных партий.

q)n:count select from tab where status=`Completed

Затем используйте приведенный ниже запрос, чтобы назначить номера партий каждой строке «Завершено»

q)btab:update batch:1+til n from tab where status=`Completed
q)btab
shop amount status    date     batch
------------------------------------
A    1234   Cancelled 20101010
A    1234   Cancelled 20101010
A    1234   Completed 20101010 1
A    1234   Cancelled 20101010
A    1234   Completed 20101011 2
A    1000   Completed 20101011 3
B    100    Cancelled 20101011
B    100    Cancelled 20101011
B    4321   Cancelled 20101011
B    4321   Cancelled 20101011
C    333    Cancelled 20101012
C    333    Completed 20101012 4
C    333    Completed 20101012 5
D    111    Cancelled 20101013
D    155    Cancelled 20101013
D    111    Completed 20101013 6
D    155    Completed 20101013 7

Затем переверните таблицузаполнить вперёд нулевые значения по дате, магазину и сумме, отменить назад и удалить все отмены со степенью 10 (используя ту же логику, что и terrylynch)

q)ftab:reverse update fills batch by date,shop,amount from reverse btab where not (status=`Cancelled)&{x=`int$x}10 xlog amount
q)ftab
shop amount status    date     batch
------------------------------------
A    1234   Cancelled 20101010 1
A    1234   Cancelled 20101010 1
A    1234   Completed 20101010 1
A    1234   Cancelled 20101010
A    1234   Completed 20101011 2
A    1000   Completed 20101011 3
B    100    Cancelled 20101011
B    100    Cancelled 20101011
B    4321   Cancelled 20101011
B    4321   Cancelled 20101011
C    333    Cancelled 20101012 4
C    333    Completed 20101012 4
C    333    Completed 20101012 5
D    111    Cancelled 20101013 6
D    155    Cancelled 20101013 7
D    111    Completed 20101013 6
D    155    Completed 20101013 7

, а затем выбрать из таблицы и получить данные, которые имеютномера партий

q)stab:select from ftab where batch<>0N
q)stab
shop amount status    date     batch
------------------------------------
A    1234   Cancelled 20101010 1
A    1234   Cancelled 20101010 1
A    1234   Completed 20101010 1
A    1234   Completed 20101011 2
A    1000   Completed 20101011 3
C    333    Cancelled 20101012 4
C    333    Completed 20101012 4
C    333    Completed 20101012 5
D    111    Cancelled 20101013 6
D    155    Cancelled 20101013 7
D    111    Completed 20101013 6
D    155    Completed 20101013 7
q)

Наконец, вот запрос для получения количества отмен в партии

q)select numberOfCancellations:-1+count batch by batch from stab
batch| numberOfCancellations
-----| ---------------------
1    | 2
2    | 0
3    | 0
4    | 1
5    | 0
6    | 1
7    | 1
1 голос
/ 20 июня 2019

Это не окончательный запрос, а как минимум начальная точка:

q)select from tab where not (status=`Cancelled)&{x=`int$x}10 xlog amount, ({raze(reverse maxs reverse@)each`Completed=x[`status] group x`amount};([]amount;status)) fby ([]date;shop)
shop amount status    date    
------------------------------
A    1234   Cancelled 20101010
A    1234   Cancelled 20101010
A    1234   Completed 20101010
A    1234   Completed 20101011
A    1000   Completed 20101011
C    333    Cancelled 20101012
C    333    Completed 20101012
C    333    Completed 20101012
D    111    Cancelled 20101013
D    155    Cancelled 20101013
D    111    Completed 20101013
D    155    Completed 20101013

Пакетная логика может быть выполнена с последующим запросом

...