3

最適化しようとしているクエリがありますが、あまり成功していません。2つのテーブルがあります。1つはメインデータを持ち、もう1つは特定のイベントが発生したときのタイムスタンプを持ちます。テーブルは、adIDの共通キーを使用してリレーショナルになっています。メインテーブルからすべてのタイムスタンプとその他のデータを取得するクエリを実行しようとしています。私はそれを機能させていますが、より速く実行されるように最適化しようとしています。

SELECT a.ID,a.repID,a.artistID,
(
    SELECT TOP 1 c.timestamp
    FROM Tracking AS c
    WHERE statusID = 4
    AND c.ID = a.ID
    ORDER BY c.timestamp ASC

) 
AS created,
(
    SELECT TOP 1 d.timestamp
    FROM Tracking AS d
    WHERE statusID = 5
    AND d.ID = a.ID
    ORDER BY d.timestamp ASC
)
AS claimed,
(
    SELECT TOP 1 p.timestamp
    FROM Tracking AS p
    WHERE statusID = 6
    AND p.ID = a.ID
    ORDER BY p.timestamp ASC
)
AS proof,
(
    SELECT TOP 1 v.timestamp
    FROM Tracking AS v
    WHERE statusID = 8
    AND v.ID = a.ID
    ORDER BY v.timestamp ASC
)
AS approved,
(
    SELECT count(ID)
    FROM Tracking AS t
    WHERE statusID = 6
    AND t.ID = a.ID
)
AS proofcount
FROM Advertising AS a
WHERE a.statusID = 8

これに関するどんな助けもありがたいです。私はSQLServerにあまり詳しくないので、このようなクエリの最適化にはあまり精通していません。

4

2 に答える 2

2

以下を使用できるはずです。

SELECT a.ID,
  a.repID,
  a.artistID,
  min(case when t.statusID = 4 then t.timestamp end) created,
  min(case when t.statusID = 5 then t.timestamp end) claimed,
  min(case when t.statusID = 6 then t.timestamp end) proof,
  min(case when t.statusID = 8 then t.timestamp end) approved,
  count(case when t.statusID = 6 then id end) proofcount
FROM Advertising AS a
LEFT JOIN Tracking t
  on a.id = t.id
WHERE a.statusID = 8
GROUP BY a.ID, a.repID, a.artistID;
于 2013-02-15T20:24:03.103 に答える
1

次のクエリはあなたが望むものになると思います:

select id, repid, artistid,
       max(case when statusId = 4 and seqnum = 1 then timestamp end),
       max(case when statusId = 5 and seqnum = 1 then timestamp end),
       max(case when statusId = 6 and seqnum = 1 then timestamp end),
       max(case when statusId = 8 and seqnum = 1 then timestamp end),
       sum(case when statusId = 6 then 1 else 0 end)
from (select a.ID, a.repID, a.artistID, t.statusId, t.timestamp
             row_number() over (partition by a.id, t.statusId order by timestamp) as seqnum
      from advertising a left outer join
           tracking t
           on a.id = t.id
    ) t
where seqnum = 1
group by id, repid, artistid

テーブルを結合し、 を使用して最も古いレコードを識別しrow_number()ます。次に、これらのレコードとグループのみを他のフィールドで選択します。

また、クエリは、 を持つレコードのみをフィルタリングしますstatusid = 8。これが意図的なものかどうかはわかりません。その場合having、クエリの最後に次の句が必要です。

having sum(case when statusId = 8 then 1 else 0 end) > 0
于 2013-02-15T20:10:59.667 に答える