Обновите столбец с LastExclusionDate - PullRequest
       6

Обновите столбец с LastExclusionDate

0 голосов
/ 18 сентября 2018

В SQL Server 2012 у меня есть таблица t1, в которой мы храним список исключенных товаров.

Я хотел бы добавить столбец LastExclusionDate для хранения даты с момента появления продуктаисключено.

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

Я бы хотел найти запрос T-SQL для обновления LastExclusionDatecolumn.

Я хотел бы использовать его для заполнения столбца LastExclusionDate в первый раз (= инициализация) и использовать его каждый день для обновления столбца при добавлении новой строки

I 'Я пробовал этот запрос, но я не знаю, как получить LastExclusionDate!

;WITH Cte AS
(
    SELECT
        product_id,
        CreationDate,
        LAG(CreationDate) OVER (PARTITION BY Product_ID ORDER BY CreationDate) AS GapStart,
        (DATEDIFF(DAY, LAG(CreationDate) OVER (PARTITION BY Product_id ORDER BY CreationDate), CreationDate) -1) AS GapDays
    FROM 
        #t1
)
SELECT *
FROM cte

Вот некоторые примеры данных:

+------------+--------------+--------------------------------+
| product_id | CreationDate | LastExclusionDate_(toPopulate) |
+------------+--------------+--------------------------------+
|        100 | 2018-05-01   | 2018-05-01                     |
|        100 | 2018-05-02   | 2018-05-01                     |
|        100 | 2018-05-03   | 2018-05-01                     |
|        100 | 2018-06-01   | 2018-06-01                     |
|        100 | 2018-06-02   | 2018-06-01                     |
|        200 | 2018-09-01   | 2018-09-01                     |
|        200 | 2018-09-02   | 2018-09-01                     |
|        200 | 2018-09-17   | 2018-09-17                     |
+------------+--------------+--------------------------------+

Спасибо

Ответы [ 2 ]

0 голосов
/ 18 сентября 2018

Для текущих ежедневных вставок это можно сделать примерно так:

INSERT INTO <yourTable>
    SELECT 
        newProduct.[product_id],
        newProduct.[creationDate],
        isnull(existingProduct.[lastExclusionDate], newProduct.[creationDate]) AS [lastExclusionDate]
    FROM 
        (SELECT <@product_id> AS [product_id], <@createionDate> AS [creationDate]) AS newProduct 
    LEFT JOIN #temp existingProduct
        ON existingProduct.[product_id] = newProduct.product_id
        AND existingProduct.[creationDate] = DATEADD(DAY,-1,newProduct.[creationDate])

У меня есть демо здесь http://rextester.com/BDEO23118.Это больше, чем необходимо, потому что он использует приведенный выше код с данными, которые вы предоставили, чтобы заполнять таблицу построчно, как вы это делаете в ежедневном процессе обновления.Затем он выполняет отдельные вставки с использованием этого кода с некоторыми новыми датами, чтобы вы могли видеть, как он обрабатывает новые диапазоны.(только для справки, рецензент отображает даты результатов в формате day.month.year в формате чч: мм: сс, но вы можете записать сценарий в Management Studio, и он будет выводиться в формате DATE)

0 голосов
/ 18 сентября 2018

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

WITH 
  cte (product_id, CreationDate, grp) AS (
    SELECT product_id, CreationDate
        , DATEDIFF(day, '19000101', CreationDate)
          - ROW_NUMBER() OVER (PARTITION BY product_id ORDER BY CreationDate)
    FROM #t1
  )
SELECT product_id, CreationDate
    , MIN(CreationDate) OVER (PARTITION BY product_id, grp) AS LastExclusionDate
FROM cte
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...