2

Oracle10gを使用しています。SQLでの私の調査-最大値とhttp://jan.kneschke.de/projects/mysql/groupwise-max/
の列を持つ行を選択する方法

max(row)をどうするかを考えてから、他のmax(rows)を見つけます。しかし、私はまだそこにいません。

基準: IDのmax(enroll_date)のコードは「WHEAT」である必要があります。
コードが「WHEAT」である最大登録日は必要ありません。最大登録日のコードが「WHEAT」の場合にのみ行が必要です。

質問:基準を満たすクエリを作成するにはどうすればよいですか?

ID = 30、Code = WHEATを返すため、これは機能しません。日付は2001年12月25日で、そのIDのmax(date)ではありません。

    select ID, code, max(enroll_date)
    from enrollment
    where  CODE = 'WHEAT'
    group by ID, code

ID = 30、Code = WHEAT、date = 12/25/2001を返すため、これも機能しません。

    select ID, code, max(enroll_date)
    from enrollment
    group by ID, code
    having code='WHEAT'

これが私のテーブルです

ENROLLMENT
===========================
ID  CODE     ENROLL_DATE
--------------------------
01  WHEAT   <NULL>
01  WHEAT   12/21/2007
01  WHEAT   7/30/2009
30  WHEAT   12/25/2001
30  CHAFF   6/14/2010
72  WHEAT   8/20/2002
72  WHEAT   12/7/2007

 DESIRED RESULT 
 ID    CODE ENROLL_DATE
 ================================
  01     WHEAT  7/30/2009
  72     WHEAT  12/7/2007
4

4 に答える 4

7

あなたは次のようなものが欲しいようです

SELECT id, 
       code,
       enroll_date
  FROM (SELECT id, 
               code,
               enroll_date,
               rank() over (partition by id 
                                order by enroll_date desc nulls last) rnk
          FROM enrollment)
 WHERE rnk = 1
   AND code = 'WHEAT'

分析関数は、特定の値1にRANK最新のものを割り当て、次にその値2に最新のものを割り当てます。次に、外部クエリでランクとコードを参照できます。重複する可能性がある場合は、代わりにまたは分析関数を使用することをお勧めしますENROLL_DATEIDENROLL_DATEIDDENSE_RANKROW_NUMBER

クエリを書くこともできます

SELECT id, 
       code,
       enroll_date
  FROM (SELECT id, 
               code,
               enroll_date,
               max(enroll_date) over (partition by id) max_enroll_date
          FROM enrollment)
 WHERE enroll_date = max_enroll_date
   AND code        = 'WHEAT'
于 2011-06-22T22:03:47.720 に答える
2

Oracleのドキュメントで「分析関数」を調べてください。これにより、やりたいことが実行されます。

基本的に、クエリから返されたレコードをグループに並べ替えることができますが、それでも行のすべての列にアクセスできます。enroll_dateで並べ替えられたグループの最初の行のコードが'WHEATであることを確認するだけです。 '

于 2011-06-22T21:48:16.633 に答える
1

この単純なクエリは、目的の結果を生成します

select * from t where enrolldate=
(select max(enrolldate) from t as t1
  where t.id=t1.id)
  and t.code='WHEAT'
于 2011-06-22T23:48:02.087 に答える
1

クエリの目的で、最大登録日行のみを含む別のテーブルが必要です。したがって、サブクエリを使用してこれを実現できます。

SELECT ID, Code, EnrollDate
FROM enrollment a
INNER JOIN (SELECT ID, MAX(EnrollDate) AS MaxEnrollDate
            FROM enrollment
            GROUP BY ID) b
ON (a.ID = b.ID AND a.EnrollDate = b.MaxEnrollDate)
WHERE Code = 'WHEAT'

うまくいけば、私はこれを適切に行いました。私がしていなくても、そのアイデアはうまくいくはずです。

于 2011-06-22T22:04:43.333 に答える