我有一个包含4列的表:
ItemId, ItemPrice, DateFrom, DateTo
该表包含有关商品,其价格以及价格更改日期的信息
例如:
我想做的是填充DateTo列,以便我知道价格持续了多长时间以及价格是否持续了
我期望的结果:
还有一个重要的注意事项是,价格变化的计数是未知的,对于某些商品,它会变化3次,对于某些商品,它根本不会变化,并且价格一直保持到今天。
任何帮助将不胜感激。
答案 0 :(得分:0)
视图将是解决此问题的更好的方法,因为不需要使用AFTER UPDATE
触发器,并且您不能持久存储具有值GETDATE()
的列(因此您必须更新每天开始时DateTo
的值)。这将为您带来想要的结果:
CREATE VIEW YourView AS
SELECT ItemId,
ItemPrice,
DateFrom,
LEAD(DATEADD(DAY,-1,DateFrom),1,GETDATE()) OVER (PARTITION BY ItemId ORDER BY DateFrom ASC) AS DateTo
FROM YourTable;
答案 1 :(得分:0)
请尝试以下查询-Check it online
DECLARE @Tab TABLE
(
itemid INT,
itemprice INT,
DateFrom Date
)
INSERT INTO @Tab VALUES (111,5000,'2018-01-01'),(111,8000,'2018-02-24'),(111,6000,'2018-03-12')
SELECT *,ISNULL(
(SELECT top 1 DATEADD(day,-1,DateFrom)
from @tab t1
WHERE t1.itemid= t2.itemid
AND t1.Datefrom > t2.Datefrom) , GETDATE()) AS DateTo
FROM @tab t2
答案 2 :(得分:0)
您需要将每条记录的DateTo
设置为大于其自身{{的所有起始日期(对于同一ItemId
)的最小 1}},减去1天”。
对于那些找不到它的人,将其设置为GetDate()。
在SQL中:
DateFrom
或合并为一个步骤:
UPDATE PriceTable
SET DateTo = (SELECT DATEADD(d, -1, MIN(DateFrom))
FROM PriceTable P2
WHERE P2.ItemId = P1.ItemId
AND P2.DateFrom > P1.DateFrom)
FROM PriceTable P1
UPDATE PriceTable
SET DateTo = GETDATE()
WHERE DateTo IS NULL
答案 3 :(得分:0)
您可以看到在adhoc basic上创建date_to列。低于
SELECT ItemId, ItemPrice, DateFrom,
DATEADD(day, 1, lead(DateFrom,1,getdate()))
over (order by ItemId asc ,DateFrom asc) as date_to
FROM tbl
您可以将值更新为
UPDATE tbl T2 SET dateto=
(SELECT
DATEADD(day, 1, lead(DateFrom,1,getdate())) over (order by ItemId asc ,DateFrom asc)
FROM tbl T1 where T1.ItemId=T1.ItemId AND T1.ItemId = T2.ItemId AND T1.DateFrom =
T2.DateFrom)
答案 4 :(得分:-1)
对于将来添加触发器,该触发器在插入新行时更新dateTo
,现在您必须选择先前的值DateFrom
SELECT ItemId, ItemPrice, DateFrom,
SELECT(DateFrom FROM tbl WHERE ItemId IN (
SELECT TOP 1 ItemId FROM tbl WHERE tbl.ItemId = tbl1.ItemId
WHERE tbl.DateFrom < tbl1.DateFrom
ORDER BY tbl.DateFrom DESC)
) FROM tbl AS tbl1