2

私はこのようなテーブルを持っています

id   color  shade   date
---  ----   -----   -----
1    red    dark    01/01/1990
2    red    light   09/16/2013
3    green  light   08/15/2010
4    green  dark    09/18/2012
5    maroon dark    08/20/2013
6    white  dark    08/31/2013
7    white  light   08/30/2012
8    purple light   08/20/2010

色ごとに最新の日付のエントリが必要でした。だから私はやってみました:

select id, color, shade, max(date) from mytable;

これは機能せず、エラーが発生しました:

is invalid in the select list because it is not contained in either an aggregate 
function or the GROUP BY clause.

わかりましたのでGroup By、エラーで示唆されているように追加しました

select id, color, shade, max(date) from mutable
Group by id, color, shade

これにより、望ましい結果が得られました。

質問

ここで、特定の色についてのみ上記と同じクエリを繰り返したいと思いました。たとえば、赤と緑のものだけを見たかったのです。

だから私はした:

select id, color, shade, max(date) from mutable
Where color in ('red', 'green')
Group by id, color, shade;

ただし、これらは でグループ化されていると思われるため、正しい数の結果が得られませんshade

目的の結果を取得する最良の方法は何ですか? 基本的に、私max dateは同じものの2つのインスタンスのうち、さらにテーブルから特定の色だけが欲しい.

4

5 に答える 5

2

これについて考える簡単な方法は、最初に各色の最新の日付を取得するクエリを作成することです。

select color, max([date]) as maxdate
from mytable
group by color;

次に、このクエリを、元​​のテーブルからすべての行を取得するだけの単純な選択クエリと結合します。

select t.[id], t.color, t.shade, sq.maxdate
from mytable as t
inner join (
  select color, max([date]) as maxdate
  from mytable
  group by color
) as sq
on (t.color = sq.color);

次に、結果を特定の色のみに制限するにwhereは、クエリの最後に句を追加します。

where color in ('red', 'green');
于 2013-09-17T01:23:17.793 に答える
2

これを試して

SELECT t1.* FROM t t1
JOIN 
(
  SELECT color, MAX([date]) [date] FROM t
  WHERE color IN ('red', 'green')
  GROUP BY color
) t2
ON t1.color = t2.color AND t1.date = t2.date
ORDER BY ID

出力

id  color   shade   date
2   red     light   2013-09-16
5   green   dark    2013-08-20

また

SELECT id, color, shade, [date]
FROM 
(
  SELECT *,
        row_number() OVER (PARTITION BY color ORDER BY [date] DESC) AS sno
  FROM t
  WHERE color IN ('red', 'green')
) tt
WHERE sno = 1
ORDER BY ID

出力

id  color   shade   date
2   red     light   2013-09-16
5   green   dark    2013-08-20

また

SELECT id, color, shade, [date]
FROM 
(
  SELECT *,
        MAX([date]) OVER (PARTITION BY color) AS maxdate
  FROM t
  WHERE color IN ('red', 'green')
) tt
WHERE [date] = maxdate
ORDER BY ID

出力

id  color   shade   date
2   red     light   2013-09-16
5   green   dark    2013-08-20
于 2013-09-17T05:42:23.630 に答える
1
select id, color, shade, max(date) over() AS m_date from mutable

IN 分析関数で使用される OVER CLAUSE

于 2013-09-17T00:35:56.973 に答える
0

これを行う最も簡単な方法は、ウィンドウ/ランキング関数を使用することです。を使用した例を次に示しrow_number()ます。

select id, color, shade, "date"
from (select t.*,
             row_number() over (partition by color order by "date" desc) as seqnum
      from mytable
     ) t
where seqnum = 1;
于 2013-09-17T03:59:21.630 に答える