根据另一列的值设置列值

时间:2018-11-22 12:25:38

标签: sql sql-server tsql

我有一个包含4列的表:

ItemId, ItemPrice, DateFrom, DateTo

该表包含有关商品,其价格以及价格更改日期的信息

例如:

Before update

我想做的是填充DateTo列,以便我知道价格持续了多长时间以及价格是否持续了

我期望的结果:

After update

还有一个重要的注意事项是,价格变化的计数是未知的,对于某些商品,它会变化3次,对于某些商品,它根本不会变化,并且价格一直保持到今天。

任何帮助将不胜感激。

5 个答案:

答案 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