ms sql temporal table在最后一次更改的列上查找历史记录

时间:2016-11-10 17:02:26

标签: sql sql-server tsql sql-server-2016

我需要查询时态表的历史表,以查找列值更改的最后时间以及与现在相比的差异。由于还有其他更改也记录在表中,我只需要找到更改列数据的位置,然后找出更改的数量和更改时间

我的时间历史表看起来像这样

Id     |Price          |LastModifiedDate  |other data
------ |---------------|------------------|--------
696733 |9995           |08/Nov/2016 09:30 |1 -other change
696733 |9995           |06/Nov/2016 09:28 |2 -price change -current price
696733 |10995          |30/Oct/2016 09:29 |2 -other change - prev price
696733 |10995          |29/Oct/2016 09:29 |3 -other change
696733 |10995          |26/Oct/2016 10:10 |4 -other change
696733 |10995          |26/Oct/2016 08:42 |5 -other change
696733 |10995          |25/Oct/2016 10:11 |6 -price change -
696733 |11595          |22/Oct/2016 09:50 |6 -other change - old old price
696733 |11595          |21/Oct/2016 15:26 |7 -other change

因此,我们希望将9995作为当前价格返回,将10995作为之前的价格和更改日期返回06 / Nov / 2016 09:28并忽略之前的任何其他价格变化。然后,我需要对结果进行过滤以检查更改是否在28天前说出来,所以它需要是我可以放入子查询或交叉应用的解决方案

我一直在尝试使用" OVER(订单"以避免使用丢失的嵌套查询

提前致谢

修改

我的sql小提琴示例http://sqlfiddle.com/#!6/05db1/7

注意sql小提琴不支持时态表,所以不得不模仿它

1 个答案:

答案 0 :(得分:1)

您可以使用OUTER APPLYORDER BY来获取与当前价格不同的最新历史记录(假设当前价格在Pricing表中)

SELECT
    p.Id,
    p.Price AS current_price,
    ph.Price AS prev_price,
    ph.LastModifiedDate AS prev_price_date
FROM [Pricing] p
    OUTER APPLY (
        SELECT TOP 1 ph1.Price, ph1.LastModifiedDate
        FROM [PriceHistory] ph1
        WHERE ph1.Id = p.Id
            AND ph1.Price <> p.Price
        ORDER BY ph1.LastModifiedDate DESC
    ) AS ph