【问题标题】:Update a Field/Column based on Current and Previous Record Value根据当前和以前的记录值更新字段/列
【发布时间】:2011-12-01 10:50:23
【问题描述】:

我需要根据当前记录和以前记录之间的比较来更新字段/列“IsLatest”方面的帮助。我正在使用 CTE 的语法,并且能够获取当前和以前的记录,但我无法根据当前和以前记录的字段/列“值”更新我需要的字段/列“IsLatest”。

例子

电流输出

Dates                   Customer    Value   IsLatest
2010-01-01 00:00:00.000    1            12  1

Dates                   Customer    Value   IsLatest
2010-01-01 00:00:00.000    1            12  0
2010-01-02 00:00:00.000    1            30  1

Dates                   Customer    Value   IsLatest
2010-01-01 00:00:00.000    1            12  0
2010-01-02 00:00:00.000    1            30  0
2010-01-03 00:00:00.000    1            13  1

预期的最终输出

Dates                   Customer    Value   ValueSetId IsLatest
2010-01-01 00:00:00.000    1            12     12          0
2010-01-01 00:00:00.000    1            12     13          0
2010-01-01 00:00:00.000    1            12     14          0

2010-01-02 00:00:00.000    1            30     12          0
2010-01-02 00:00:00.000    1            30     13          0
2010-01-02 00:00:00.000    1            30     14          0

2010-01-03 00:00:00.000    1            13     12          0
2010-01-03 00:00:00.000    1            13     13          0
2010-01-03 00:00:00.000    1            13     14          0

2010-01-04 00:00:00.000    1            14     12          0
2010-01-04 00:00:00.000    1            14     13          0
2010-01-04 00:00:00.000    1            14     14          1

【问题讨论】:

  • ;WITH CustCTE AS (SELECT Customer, Value, Dates, ROW_NUMBER() OVER (PARTITION BY Customer ORDER BY Dates) RowNum FROM @Customers),

标签: sql sql-server-2008 common-table-expression


【解决方案1】:
;WITH a AS
(
SELECT 
  Dates Customer Value, 
  row_number() over (partition by customer order by Dates desc, ValueSetId desc) rn
FROM @Customers)
SELECT Dates, Customer, Value, case when RN = 1 then 1 else 0 end IsLatest
FROM a

【讨论】:

  • 您好 t-clausen.dk,谢谢。我有与上面类似的代码,但是,我没有使用 DESC,因为我的想法是使用当前和以前的记录,这让我陷入了困境。
  • 嗨 t-clausen.dk,只是另一个问题,如果上表有另一个唯一标识行的字段但上面的输出仍然需要相同,我将如何更改代码。示例 foreach 日期,每个客户您有 3 个不同的值。附加字段“PeriodSetId”以小时为单位标识时间点的记录,例如 12,15 14 等。
  • @LindsayFisher 不确定你在问什么,你能用预期的结果和测试数据来改变你的问题吗?
  • 您好 t-clausen.dk,我更改了上面的预期结果示例,但是,我也想通了。我将 ValueSetId 包含在客户的“partition by”语句中,这给我带来了不正确的结果,并且在删除 ValueSetId 字段但使用 DESC 将其包含在“Order By”中后它起作用了。查看代码;使用 AS(选择日期, Customer, Value, ValueSetId, row_number() over (按客户订单分区,按日期 desc, ValueSetId DESC) rn FROM @Customers ) SELECT Dates, Customer, Value, ValueSetId, case when RN = 1 then 1 else 0 end IsLatest FROM a按日期订购,客户
  • @LindsayFisher 是的,在你的例子中会这样做
猜你喜欢
  • 1970-01-01
  • 2018-05-28
  • 1970-01-01
  • 1970-01-01
  • 2016-07-04
  • 1970-01-01
  • 2011-08-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多