0

テーブル内のレコード数が 500 000 レコードを超えていることもあり、このクエリには長い時間がかかりますが、少なくとも私の信念では、使用する必要がある結合により、かなり遅くなります

SELECT TOP (10) PERCENT H1.DateCompteur, CASE WHEN (h1.cSortie - h2.cSortie > 0)         
THEN h1.cSortie - h2.cSortie ELSE 0 END AS Compte, H1.IdMachine
FROM dbo.T_HistoriqueCompteur AS H1 INNER JOIN
     dbo.T_HistoriqueCompteur AS H2 ON H1.IdMachine = H2.IdMachine AND H2.DateCompteur =
     (SELECT MAX(DateCompteur) AS Expr1
        FROM dbo.T_HistoriqueCompteur AS HS
       WHERE (DateCompteur < H1.DateCompteur) AND (H1.IdMachine = IdMachine))
ORDER BY H1.DateCompteur DESC

最新の情報だけが必要なので、順序は重要です。サブセレクトで ID フィールドを使用してみましたが、これらは日付順に並べられていますが、大幅な改善は見られませんでした。

SELECT TOP (10) PERCENT H1.DateCompteur, CASE WHEN (h1.cSortie - h2.cSortie > 0)         
THEN h1.cSortie - h2.cSortie ELSE 0 END AS Compte, H1.IdMachine
FROM dbo.T_HistoriqueCompteur AS H1 INNER JOIN
     dbo.T_HistoriqueCompteur AS H2 ON H1.IdMachine = H2.IdMachine AND H2.ID =
     (SELECT MAX(ID) AS Expr1
        FROM dbo.T_HistoriqueCompteur AS HS
       WHERE (ID < H1.ID) AND (H1.IdMachine = IdMachine))
ORDER BY H1.DateCompteur DESC

私が使用するテーブルはこれに少し似ています (もっと多くの列がありますが、このクエリでは使用されていません)。

ID bigint
IdMachine bigint
cSortie bigint
DateCompteur datetime

サブセレクトを取り除くことができれば、クエリははるかに高速に実行されると思いますが、実際にそうする方法を見つけることができません. 私が本当にやりたいことは、同じ IdMachine を持つ前の行を見つけて、2 つの cSortie 値の差を計算できるようにすることです。クエリのケースは、何かが 0 にリセットされているためです。この場合、負の値ではなく 0 を返したいと考えています。

だから私の質問はこれです:私はすでに持っているものよりもうまくやることができますか??? それが違いを生むなら、私はこれをビューに入れる予定です。

4

2 に答える 2

0

ウィンドウ関数 (ROW_NUMBER) を使用して CTE (共通テーブル式) を試すこともできます。

;WITH CTE AS
(
    SELECT ID,IdMachine,cSortie,ROW_NUMBER() OVER(PARTITION BY h.IdMachine ORDER BY ID ASC) AS [ROW] 
    FROM T_HistoriqueCompteur h
)
SELECT 
    TOP (10) PERCENT 
        H1.DateCompteur,
        CASE WHEN (h1.cSortie - h2.cSortie > 0) THEN h1.cSortie - h2.cSortie 
            ELSE 0 
        END AS Compte,
        H1.IdMachine
FROM dbo.T_HistoriqueCompteur AS H1 
INNER JOIN CTE cte on cte.idmachine = h1.idmachine and cte.id = h1.id
INNER JOIN CTE h2 on h2.idmachine = cte.idmachine and h2.row + 1 = cte.row
ORDER BY H1.DateCompteur DESC
于 2013-08-02T14:26:40.900 に答える
0

このクエリを試してください

WITH T as
(
  SELECT TOP (10) PERCENT H1.DateCompteur, H1.cSortie as cSortie1, H1.IdMachine,
  (
        SELECT TOP 1 H2.cSortie
        FROM dbo.T_HistoriqueCompteur H2
        WHERE (H2.DateCompteur < H1.DateCompteur) AND (H1.IdMachine = H2.IdMachine)
        ORDER BY H2.DateCompteur DESC   
  ) as cSortie2
  FROM dbo.T_HistoriqueCompteur AS H1
  ORDER BY H1.DateCompteur DESC 
)

select DateCompteur, 
       CASE WHEN (cSortie1 - cSortie2 > 0)         
            THEN cSortie1 - cSortie2 
            ELSE 0 END 
            AS Compte, 
       IdMachine
FROM T
于 2013-08-02T13:18:35.107 に答える