[前][次][番号順一覧][スレッド一覧]

mysql:9025

From: Seiji Uramoto <Seiji Uramoto <uramoto@xxxxxxxxxx>>
Date: Fri, 19 Mar 2004 22:12:07 +0900
Subject: [mysql 09025] Re: GROUP BY ... で定義して最新のデータを取得したい

うらもとといいますが。

konet218@xxxxxxxxxx wrote:
> 近藤と申します。

> SELECT NO, MESSAGE, DATE, count(NO) as count FROM sample_tb GROUP BY
> DATE ORDER BY NO DESC
>
> として、「同一のDATEは複数取得せず、NOの一番大きい値のレコードを1つ
> だけ取得したい」のです。

この SQL は、文法として正しくありません。
取得しようとしている
NO, MESSAGE, DATE, count(NO) as count
のうち、
DATE と count(NO)以外は、何が返って来るのか不定です。
Oracle ではあきらかなエラーになるはずだし、PostgreSQL でも
エラーになったっけ?もしかしたら、動くかも。
しかし、NO や MESSAGE は、「同一グループ(DATE)内の
何を返せばいいのか、明示されていない」ために、
期待した値は返って来ません。

さらに、NO を出力しておきながら、NOの数を出す、というのは
矛盾しています。
この場合、count(DATE) になるかと。

> そこで疑問になったのですが、
> 「同一のDATEは複数取得せず、NOの一番大きい値のレコードを1つだけ取得したい」
> の、
> 「NOの一番大きい値のレコードを1つだけ取得したい」の条件はクリアするのでしょうか?

そのままSQL文にすればいいかと。
「一番大きい値」は MAX関数です。
つまり、
「同一のDATEは複数取得せず、NOの一番大きい値のレコードを1つだけ
取得したい」
という、場合は
SELECT max(NO) as maxno
     , DATE
     , count(DATE) as count
  FROM sample_tb
 GROUP BY DATE
 ORDER BY maxno DESC
となります。

ただし、この構文では MESSAGEを取得することができませんので、
SQL で書く場合は、以下のようになります。
「DATE文で纏めたデータのうち、NOが一番大きいデータ
  の NO と MESSAGE」
つまり
SELECT A.NO
     , A.MESSAGE
     , B.DATE
     , B.count
  FROM sample_tb AS A
       inner join
       (SELECT max(NO) as maxno
             , DATE
             , count(DATE) as count
          FROM sample_tb
         GROUP BY DATE
         ORDER BY maxno DESC
        ) AS B
        on  A.NO = B.maxno
         and A.DATE = B.DATE      <- これは不要かな。
というような記述になるはずです。
(未確認注意)

丸カッコで囲われた部分を VIEW にすれば、ある程度見やすい
SQL文になるかと思いますが、MySQL には VIEW が無かったと
思いますので、別の手段を使うことになるかな。

丸カッコで囲われた部分を、テンポラリテーブルに格納することで
すっきりした記述になると思います。

あとは、MySQLに詳しい人に任せた。


[前][次][番号順一覧][スレッド一覧]

      9023 2004-03-19 20:51 [<konet218@xxxxxxxxxx] GROUP BY ... で定義して最新のデータを取得したい
->    9025 2004-03-19 22:12 ┣[Seiji Uramoto <uramo]                                       
      9026 2004-03-19 22:43 ┗["UNO Shintaro" <uno@]                                       
      9027 2004-03-19 22:53  ┗[<konet218@xxxxxxxxxx]