Получение всех записей за 10 дней до дней в таблице, что соответствует предложению где - PullRequest
0 голосов
/ 09 декабря 2018

У меня есть случайная таблица данных - с датами и числами:

Date                          Open       Volume        abschange
2016.12.08D00:00:00.000000000 11035.76   1.74835e+008  1.30177
2016.12.09D00:00:00.000000000 11170.18   1.0383e+008   0.2994598
2016.12.12D00:00:00.000000000 11198.42   8.98117e+007  0.07331357
...
2016.12.30D00:00:00.000000000 11443.31   4.18109e+007  0.3298871
2017.01.02D00:00:00.000000000 11426.38   4.74561e+007  1.504853

Так что из этой таблицы я хотел бы иметь возможность создать список, который содержит все записи за 10 дней додо дней, в которых есть abschange> 1.

Я думал, что было бы проще начать с фокусировки на этих датах:

 Date                          abschange
 ---------------------------------------
 2016.12.08D00:00:00.000000000 1.30177  
 2017.01.02D00:00:00.000000000 1.504853 
 2017.01.25D00:00:00.000000000 1.099709 
 2017.01.31D00:00:00.000000000 1.344625 
 2017.02.06D00:00:00.000000000 1.016427 
 2017.02.21D00:00:00.000000000 1.265196

Затем создайте плоский список:

 mynewdates: raze tablewithDateAndabschange each

, что дает мне:

2016.12.08D........ 2017.01.02D......

Затем я застреваю, когда хочу добавить 10 предыдущих дат для каждой записи в этом списке.

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

Для обоих - если возможно, каким будет возможное решение для этого?

1 Ответ

0 голосов
/ 09 декабря 2018

Если мое понимание верно, ваше требование:

  • для каждой даты, для которой abschange> 1, получите последние 10 дат до этой даты из таблицы.

Нижезапрос создаст эту карту.Он основан на следующих предположениях:

  • Столбец даты является уникальным и упорядоченным (по возрастанию), как это видно из вашего примера.

Если указанное выше условие не выполняется, то оно будеттребуется незначительное изменение в приведенном ниже запросе для работы с дубликатами и неупорядоченным списком.

  • Таблица не имеет ключа.

    q) (tbl[`Date]a)!b@'where@'not null b:tbl[`Date] -1+(a:where 1<tbl`abschange)-\:til 10
    

ОБНОВЛЕНИЕ: На основании обсуждения в разделе комментариев.

Просто добавьте второй шаг, чтобы проверить, пуст ли список дат для первого результата.В этом случае сгенерируйте последние 10 дат с этой даты.

Наконец, он генерирует таблицу, в которой каждая строка содержит предыдущие даты (максимум 10) для каждой даты с abschange> 1.

    q)d:b@'where@'not null b:tbl[`Date] -1+(a:where 1<tbl`abschange)-\:til 10
    q)d[0]:$[0=count d 0;(t[`Date]a 0)-1+til 10;d 0]
    q)([]dates:d)
...