4

(Log) から別のテーブル (BigTable) にデータをコピーする必要があるテーブルがあります。ログ テーブルは次のデータを取得しました。

   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

ログの値で BigTable を更新しようとしています。LogID 1 と 2 (上記) のようにエントリが重複している場合は、最新の日付 (2012-09-01 00:05:33) のみを取得していることに注意してください。「ストップ 1 の POB」のみに関心があるため、POB についても同じことが望まれます。

多くの Job 番号の Log には何百万もの行がありますが、BigTable のみにある Job の時間を取得する必要があります。理想的なテーブル (すべての更新後) は次のようになります。

   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

私はこの分野では初心者であることに注意してください。どんな助けでも大歓迎です。前もって感謝します。よろしく

4

2 に答える 2

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
于 2012-09-19T16:19:06.923 に答える
0

mssqlサーバー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;
于 2012-09-19T15:40:30.343 に答える