因为我是SQL Server和T-SQL的新手,所以我需要你的帮助。
我有2个表:实时和EOD。为了理解我的问题,我给出了2个表的示例数据:
---实时表---
Symbol Date Value
ABC 1/3/2009 03:05:01 327 // this day is not existed in EOD -> inserting
BBC 1/3/2009 03:05:01 458 // this day is not existed in EOD -> inserting
ABC 1/2/2009 03:05:01 326 // this day is new -> updating
BBC 1/2/2009 03:05:01 454 // this day is new -> updating
ABC 1/2/2009 02:05:01 323
BBC 1/2/2009 02:05:01 453
ABC 1/2/2009 01:05:01 313
BBC 1/2/2009 01:05:01 423
--- EOD表---
Symbol Date Value
ABC 1/2/2009 02:05:01 323
BBC 1/2/2009 02:05:01 453
我需要创建一个存储过程来更新符号的值。如果符号中的数据是新的(在实时和EOD之间进行比较),则会在当天更新EOD的值和日期(如果存在),否则将插入。
并且商店将使用新数据更新EOD表:
--- EOD表---
Symbol Date Value
ABC 1/3/2009 03:05:01 327
BBC 1/3/2009 03:05:01 458
ABC 1/2/2009 03:05:01 326
BBC 1/2/2009 03:05:01 454
P / S:我使用SQL Server 2005.我在这里有类似的回答问题:Help to the way to write a query for the requirement
请帮帮我。感谢。
答案 0 :(得分:0)
以下是从Realtime表生成完整EOD表的代码(在MSSQL 2008上测试,但也应该在2005上运行)。
SELECT Symbol, Date, Value FROM
(
SELECT *, ROW_NUMBER() OVER(
PARTITION BY symbol, DATEPART(yy, date), DATEPART(y, date)
ORDER BY date desc) AS ord
FROM Realtime
) AS t
WHERE ord = 1
根据具体要求,您可以调整它以使其以增量方式工作。
答案 1 :(得分:0)
2个步骤:
UPDATE EOD
SET EOD.Value = REALTIME.Value
FROM EOD
INNER JOIN REALTIME
ON EOD.Symbol = REALTIME.Symbol
AND EOD.Date = REALTIME.Date
INSERT INTO EOD ( Symbol , Date , Value )
SELECT REALTIME.Symbol
, REALTIME.Date
, REALTIME.Value
FROM EOD
LEFT JOIN REALTIME
ON EOD.Symbol = REALTIME.Symbol
AND EOD.Date = REALTIME.Date
WHERE EOD.Symbol IS NULL
AND EOD.Date IS NULL
这假设您在两个表中的(符号,日期)都有某种唯一性。
另外一个评论是日期的包含是有问题的,特别是包含时间组件。我建议您 CAST 或 CONVERT 将所有日期值排除在不包含时间部分的位置。我会使用CONVERT(varchar(11),EOD.Date,106)将日期转换为没有日期组件的东西。见下文:
UPDATE EOD
SET EOD.Value = REALTIME.Value
FROM EOD
INNER JOIN REALTIME
ON EOD.Symbol = REALTIME.Symbol
AND CONVERT(varchar(11), EOD.Date, 106) = CONVERT(varchar(11), REALTIME.Date, 106)
INSERT INTO EOD ( Symbol , Date , Value )
SELECT REALTIME.Symbol
, CONVERT(varchar(11), REALTIME.Date, 106)
, REALTIME.Value
FROM EOD
LEFT JOIN REALTIME
ON EOD.Symbol = REALTIME.Symbol
AND CONVERT(varchar(11), EOD.Date, 106) = CONVERT(varchar(11), REALTIME.Date, 106)
WHERE EOD.Symbol IS NULL
AND EOD.Date IS NULL