2

私はテーブルを持っています、それは次のようになります:

id  year    effective   price
1   2000    2012-01-01  1000
2   2001    2012-01-01  1100
3   2002    2012-01-01  1200
4   2003    2012-01-01  1300
5   2000    2012-03-01  1500
6   2001    2012-03-01  1600
7   2002    2012-03-01  1700
8   2003    2012-03-01  1800
9   2000    2011-12-01  900
10  2001    2011-12-01  1000
11  2002    2011-12-01  1100
12  2003    2011-12-01  1200

このテーブルには、多数のアイテムの価格履歴を含む一連のデータがあります。それらは決して規則的な順序ではなく、人々がランダムにデータベースにアクセスして変更を加えたようです。私はこのデータベースをセットアップしていませんし、データを挿入および更新するアプリケーションも開発していません。私の唯一の目的は、指定されたデータをクライアントが望む方法で提示することです。

そうは言っても、必要な情報を得るのに苦労しています。上記の例のデータでは、価格を並べ替えて、特定の年ごとに個別の数値を取得できる必要があります。これは、エンド ユーザーが入力した最新の発効日でフィルタリングする必要があります。

たとえば、ユーザーが最新のデータ (今日の日付) を求めている場合、応答は次のようになります。

5   2000    2012-03-01  1500
6   2001    2012-03-01  1600
7   2002    2012-03-01  1700
8   2003    2012-03-01  1800

一方、ユーザーが 2012 年 2 月 1 日時点の最新データが必要な場合は、次のように返されます。

1   2000    2012-01-01  1000
2   2001    2012-01-01  1100
3   2002    2012-01-01  1200
4   2003    2012-01-01  1300

私の問題は、このクエリの作成方法がわからないことにあります。これを単一のクエリとして作成することは可能ですか?それとも、データを取得するために複数のクエリを実行する必要がありますか? 年を共有しているが他の異なるデータを持つ4つの異なるテーブルからデータを取得する必要があるため、フットプリントをできるだけ小さくしたいと思います。

このクエリを試してみましたが、効果がありませんでした:

select id, year, effective, price
from mytable
group by year
having effective < '2012-02-01'

これにより、次の結果が得られます。

1   2000    2012-01-01  1000
2   2001    2012-01-01  1100
3   2002    2012-01-01  1200
4   2003    2012-01-01  1300

論理的に思えるので、これで正しい情報が得られると思っていたでしょう。

私はこのクエリを試しましたが、効果もありませんでした:

select distinct year, id, effective, price
from mytable
group by effective
having effective < '2012-02-01'

この結果を返します:

1   2000    2012-01-01  1000
5   2000    2012-03-01  1500
9   2000    2011-12-01  900

このクエリは完全に間違っているようです。

これを取得してクエリを正しく実行する方法に関する提案はありますか?

4

1 に答える 1

2

サブクエリ内で日付をフィルタリングすると、相関サブクエリを使用してMAX(effective)perを取得し、メイン テーブルに対して結合することができます。アイデアは、サブクエリが一連のモデル年と発効日を返すことです。これは、句yearで指定した日付よりも短い最大日付です。WHERE返されたこれらの列をメイン テーブルに結合して、残りの列を取り込むことができます。

SELECT 
  mytable.*
FROM
  mytable
  JOIN (
     /* Join on a subquery which returns the greatest date per year */
     SELECT MAX(effective) as effective, year
     FROM mytable 
     /* Filtering on some date in the subquery WHERE clause... */
     WHERE effective < '2012-01-01'
     GROUP BY year
  /* Since the subquery returns effective,year, join on both those cols against the main table */
  ) maxd ON mytable.effective = maxd.effective AND mytable.year = maxd.year

2012 年 1 月 1 日発効の例: http://sqlfiddle.com/#!2/05546/4

2013 年 1 月 1 日発効の例: http://sqlfiddle.com/#!2/05546/5

于 2013-01-06T16:42:37.787 に答える