テーブル内のレコード数が 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 を返したいと考えています。
だから私の質問はこれです:私はすでに持っているものよりもうまくやることができますか??? それが違いを生むなら、私はこれをビューに入れる予定です。