我有一个表,我需要将我的数据从(Log)复制到另一个表(BigTable)。 Log表获得了以下数据:
LogID LogTime JobNumber LogType Description
===== ======= ========= ======= ===========
1 2012-09-01 00:00:01 1 100 Accepted by D#12
2 2012-09-01 00:05:33 1 100 Accepted by D#14
3 2012-09-01 01:00:14 2 107 Message sent
4 2012-09-01 05:00:53 2 100 Accepted by D#78
5 2012-09-01 05:01:55 1 110 POB at Stop 1
6 2012-09-01 05:02:22 3 100 Accepted by D#98
7 2012-09-01 05:03:00 1 110 POB at Stop 2
8 2012-09-01 05:04:00 2 110 POB at Stop 1
9 2012-09-01 05:05:25 3 110 POB at Stop 1
10 2012-09-01 05:15:36 1 200 Completed
11 2012-09-01 05:20:45 2 200 Completed
BigTable中已有以下数据
JobNumber Accepted_At POB_At Completed
========= =========== ====== =========
1 NULL NULL NULL
2 NULL NULL NULL
3 NULL NULL NULL
我正在尝试使用Log中的值更新BigTable。请注意,如果有重复条目,如LogID 1和2(上图),我只会选择最新日期(2012-09-01 00:05:33)。 POB也是如此,因为我们只对“第1站的POB”感兴趣。
Log中有大量的作业号,但是,我需要花时间只处理BigTable中的作业。 Ideal表(在所有更新之后)将如下所示:
JobNumber Accepted_At POB_At Completed
========= =========== ====== =========
1 2012-09-01 00:05:33 2012-09-01 05:01:55 2012-09-01 05:15:36
2 2012-09-01 05:00:53 2012-09-01 05:04:00 2012-09-01 05:20:45
3 2012-09-01 05:02:22 2012-09-01 05:05:25 NULL
请注意我是这个领域的新手。任何帮助表示赞赏。 提前致谢。 此致
答案 0 :(得分:1)
您可以在CTE中聚合MAX日期,然后将其加入BigTable进行更新:
; WITH CTE AS (
SELECT
g.JobNumber
, Accepted_At = MAX(CASE WHEN LogType = 100 THEN LogTime END)
, POB_At = MAX(CASE WHEN LogType = 110 AND [Description] LIKE '%Stop%1' THEN LogTime END)
, Completed = MAX(CASE WHEN LogType = 200 THEN LogTime END)
FROM [Log] g
GROUP BY g.JobNumber, g.LogType
)
UPDATE b
SET Accepted_At = CTE.Accepted_At
, POB_At = CTE.POB_At
, Completed = CTE.Completed
FROM CTE
JOIN BigTable b ON b.JobNumber = CTE.JobNumber
答案 1 :(得分:0)
这将起作用,因为您使用的是mssql server 2008
merge bigtable t1
using
(select jobnumber,
min(case when description like 'Accepted by%' then logtime end)
Accepted_At, min(case when description like 'POB at%' then logtime end) POB_At,
min(case when description like 'Completed' then logtime end) Completed
from <table> group by jobnumber) t2
on t1.jobunmber = t2.jobnumber
-- the 2 next lines are optional, but they could help in
-- situations where jobnumber is not already in the bigtable
when not matched then INSERT t1(JobNumber, Accepted_At, POB_At, Completed )
values (t2.JobNumber, t2.Accepted_At, t2.POB_At, t2.Completed)
when matched then
update
set t1.Accepted_At = t2.Accepted_At,
t1.POB_At = t2.POB_At
t1.Completed = t2.Completed;