TSQL-запрос для извлечения подробностей строки из таблицы при последнем изменении значения столбца - PullRequest
2 голосов
/ 03 января 2011

У меня есть две таблицы.

Таблица 1

   Item
    1
    2

Таблица 2

   Item   Date    Amount
    1     12/31     30
    1     12/30     30
    1     12/29     20
    2     12/31     100
    2     12/30     90
    2     12/29     90

Теперь мой результат должен иметь

   Item   Date    Amount
    1    12/29     20
    2    12/30     90 
    3    12/31     12

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

Спасибо

Ответы [ 2 ]

1 голос
/ 04 января 2011
;WITH cte
     AS (SELECT *,
                Row_number() OVER (PARTITION BY Item ORDER BY Date) -
                Row_number() OVER (PARTITION BY Amount, Amount ORDER BY Date) AS
                grp
         FROM   table2)
SELECT Item,
       MAX(Amount) AS Amount,
       MIN(Date)   AS startrange,
       MAX(Date)   AS endrange,
       1+DATEDIFF(DAY,MIN(Date),MAX(Date)) AS numdays
FROM   cte
GROUP  BY grp,
          Item  

Возвращает следующее для ваших тестовых данных

Item        Amount      startrange endrange   numdays
----------- ----------- ---------- ---------- -----------
1           20          2010-12-29 2010-12-29 1
1           30          2010-12-30 2010-12-31 2
2           90          2010-12-29 2010-12-30 2
2           100         2010-12-31 2010-12-31 1
0 голосов
/ 03 января 2011

Попробуйте это:

SELECT Item, Date, Amount
FROM
(
    SELECT
        T2.Item,
        T2.Date,
        T2.Amount,
        ROW_NUMBER() OVER (PARTITION BY T2.Item ORDER BY T2.Date DESC) rn
    FROM table2 T2
    JOIN
    (
        SELECT Item, Amount
        FROM
        (
            SELECT
                Item,
                Amount,
                ROW_NUMBER() OVER (PARTITION BY Item ORDER BY Date DESC) rn
            FROM table2
        ) T1
        WHERE rn = 1
    ) T3
    ON T2.Item = T3.Item AND T2.Amount <> T3.Amount
) T4
WHERE rn = 1

Результат для данных вашего примера:

Item  Date        Amount
1     2010-12-29  20    
2     2010-12-30  90    

Пояснение

Подзапрос T3 находит самый последнийцена за каждый элемент, используя ROW_NUMBER.Затем он присоединяется к исходной таблице и удаляются строки, в которых цена товара равна самой последней цене.Затем для каждого элемента определяется самая последняя цена оставшихся данных, снова используя технику ROW_NUMBER.Это вторая самая последняя цена.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...