2017-02-07 5 views
0

SQL Serverクエリの効率化に関する質問があります。サブクエリを使用するクエリのクリーンアップ

私は値がゼロより大きい日から各IDの行を選択したい、次の列

ID   int 
ValueDate datetime 
Value  float 

を持つテーブルがあります。これは私が思い付いたSQLです

SELECT a.ID, a.ValueDate, a.Value 
FROM MyTable a, 
(SELECT ID, MIN(ValueDate) as VDate FROM MyTable WHERE Value > 0 GROUP BY ID) B 
WHERE a.ID = b.ID and a.ValueDate >= b.VDate 

これはうまくいきますが、もっと効率的な方法があるのでしょうか?私は特に、サブクエリで単一のテーブルを置き換える必要があるため、他のフォームを調べることに興味があります。私は、クエリが同じサブクエリを2回実行すると実行が遅くなるため、クエリには2度の不安があることを心配しています。サブクエリが1回だけ実行されるようにクエリを調整する必要はありますか。これは、OracleとAccessデータベースでクエリを実行する必要があるため、他の2つのデータベースシステムで同等のものが存在しない限り、SQL Server固有のものは使用できません。

+0

「ID」は一意ではありませんか?私には明らかになぜ 'GROUP'を使用するのですか – anatol

+0

単にSELECT a.ID、a.ValueDate、a.Value FROM MyTable a WHERE a.Value> 0'を使わないのはなぜですか? – anatol

+0

anatol --- IDと日付の列が一意のキーを構成します。最初の非ゼロ値で始まるデータを収集したいのでGROUP BYを使用しますが、その後にゼロ値がある場合はそれを保持する必要があります。 – user1753352

答えて

0

私はあなたの説明から理解しているように、冗長サブクエリに問題があることがわかります。

SELECT [ID] 
     ,[ValueDate] 
     ,[Value] 
    FROM [MyTable] 

ID ValueDate    Value 
1 2017-06-02 12:14:55.000 0 
1 2017-07-02 12:14:55.000 0,1 
1 2017-08-02 12:14:55.000 0,2 
2 2017-08-02 12:14:55.000 0,2 

だから、あなたのクエリが与えられる次の結果:たとえば私たちは、テーブル内の次の行を持って

ID ValueDate    Value 
1 2017-07-02 12:14:55.000 0,1 
1 2017-08-02 12:14:55.000 0,2 
2 2017-08-02 12:14:55.000 0,2 

をし、それが同じ結果を与えるSELECT a.ID, a.ValueDate, a.Value FROM MyTable a WHERE a.Value > 0に簡素化することができます。

サブクエリは結合のためだけにこれらの行を返します。その理由は何ですか?私は本当になぜそれを使用するのか分かりません。

+0

これは時系列データです。 1か月あたり1つの価値。データをグラフ化する際の清潔さのために、最初の非ゼロ値で月を開始したいと思います。しかしその後、私は毎月、ゼロの値を持つものさえも必要とします。したがって、それで始まる月を見つけるサブクエリは、ゼロ以外の値を持つ最初の月です。 – user1753352

関連する問題