1

次のスキーマを持つテーブルがある場合:

CREATE TABLE diet_watch (
  entry_date date NOT NULL,
  weight     double precision NOT NULL
);

INSERT INTO diet_watch VALUES ('2001-01-01', 128.2);
INSERT INTO diet_watch VALUES ('2001-01-02', 121.0);
INSERT INTO diet_watch VALUES ('2001-01-03', 122.3);
INSERT INTO diet_watch VALUES ('2001-01-04', 303.7);
INSERT INTO diet_watch VALUES ('2001-01-05', 121.0);
INSERT INTO diet_watch VALUES ('2001-01-06', 128.0);

2 つの日付間の最初の最小重量と最小重量が発生した日付を返すクエリを作成するにはどうすればよいですか?

理想的には、これは ANSI-SQL、つまりデータベースに依存しないものになります。SQL フレーバーを選択せざるを得ない場合、それは PostgreSQL になります。なぜなら、それが私が使用しているデータベースだからです。

疑似 SQL:

SELECT min(entry_date), min(weight)
FROM   diet_watch
where  entry date between date1 and date2
group  by entry_date;
4

4 に答える 4

3

シンプルで高速なソリューション:

SELECT weight, entry_date
FROM   diet_watch
WHERE  entry_date BETWEEN '2001-01-02' AND '2001-01-06'
ORDER  BY 1, 2
LIMIT  1;

PostgreSQL または MySQL で動作し、その他の可能性もあります (Oracle または MS SQL Server では動作しません)。

標準 SQL (SQL:2003):

SELECT weight, entry_date
FROM  (
    SELECT weight, entry_date
          ,row_number() OVER (ORDER BY weight, entry_date) AS rn
    FROM   diet_watch
    WHERE  entry_date between '2001-01-02' and '2001-01-06'
    ) AS x
WHERE rn = 1;

ウィンドウ関数を実装していない RDBMS (MySQL など) ではサポートされていません。

標準 SQL バリアント (SQL:2008):

SELECT weight, entry_date
FROM   diet_watch
WHERE  entry_date BETWEEN '2001-01-02' AND '2001-01-06'
ORDER  BY weight, entry_date
FETCH  FIRST 1 ROWS ONLY;

少数の RDBMS でのみサポートされています -ウィキペディアでリストを見つけてください。

これらすべてをサポートする唯一のRDBMS は PostgreSQL (v8.4 以降) です。


コメントで質問に答えて、ここで ORDER BY に関するマニュアルを引用します

各式は、出力列 (SELECT リスト項目) の名前または序数にするか、入力列の値から形成される任意の式にすることができます。

鉱山を強調します。これは単なる構文上のショートカットであり、多くの RDBMS でサポートされています。SQL Server は明らかにその中にありません。

于 2012-07-16T21:20:29.650 に答える
2
SELECT min(entry_date), min(weight) from diet_watch where weight = (
    SELECT MIN(weight) as wt from diet_watch where entry_date between date1 and date2
) and entry_date between date1 and date2

[編集: 質問が最小体重での体重を見つけることから最小体重での日付に変更されたように見えるため、回答はわずかに微調整されました]

また、質問は「最初の」最小重量を求めています...これは、最小重量の最も早い日付を意味すると思います。

于 2012-07-16T21:09:03.760 に答える
0

SELECT * ORDER BY weight ASC LIMIT 1 (ほとんどの DB は LIMIT をサポートしています) を要求するか、LIMIT をまったく使用せずにカーソルから最初の行を取得するだけです。

それ以外の場合は、JOIN を使用して最小値を取得し、最小値が発生した日付を取得する必要があります。最小値が達成された複数の日付の場合でも、LIMIT および/または単一のフェッチが必要になります。

于 2012-07-16T21:08:53.777 に答える
0

Gerrat の回答から作業すると、entry_date で注文して一番上の行を取得できます。

SELECT top 1 entry_date, weight
FROM diet_watch
WHERE weight = (SELECT MIN(weight) as wt from diet_watch)
ORDER BY entry_date

編集: これは SQL Server コードです。ただし、postgre で同等のものは何でも使用できます。

于 2012-07-16T21:21:05.990 に答える