Как стать автором
Обновить

Комментарии 5

Спасибо за статью. Так как я не пишу SQL профессионально, но люблю порешать задачки и поучить новое, было интересно.




Самый правильный путь для импорта из CSV — воспользоваться оператором COPY. Но мы для разминки попробуем сделать это через регулярные выражения:

При попытке вставить данные с помощью COPY может внезапно оказаться, что 01.01.2020 — это 1 января, а 02.01.2020 — это 1 февраля.


пруфы
date;client;balance
01.01.2020; Алиса;150
01.01.2020; Боб;100
02.01.2020; Алиса;100
02.01.2020; Боб;150
03.01.2020; Алиса;200
05.01.2020; Алиса;0
06.01.2020; Алиса;50
08.01.2020; Алиса;0
08.01.2020; Боб;200
09.01.2020; Алиса;0
09.01.2020; Боб;0
10.01.2020; Алиса;5

coalesce(lead(dt) OVER(PARTITION BY client ORDER BY dt), '2020-01-12') — dt days

Чтобы пересилить это дело, можно указать явно порядок (день-месяц-год) с помощью set datestyle to 'DMY' (подробнее здесь). Однако так как в статье в разных местах используется разный формат данных ('02.01.2020' и '2020-01-12'), с этим тоже могут возникнуть проблемы.

Однако так как в статье в разных местах используется разный формат данных ('02.01.2020' и '2020-01-12'), с этим тоже могут возникнуть проблемы.
Это как раз не большая проблема, поскольку решается переключением datestyle сначала «туда» (DMY), как было правильно подмечено, а потом «обратно» (YMD).
LATERAL-подзапрос позволил нам вычислить дополнительное поле без лишнего прохода по выборке

в каком случае появился бы лишний проход? я так понимаю, выбор между later и повторить balance > 0 несколько раз в select-е

В случае предварительного вычисления этого поля в отдельной CTE:
WITH step0 AS (
  SELECT
    *
  , balance > 0 cond
  FROM
    tbl
)
, step123 AS (
   ...
  FROM
    step0
)
Зарегистрируйтесь на Хабре, чтобы оставить комментарий