0


各顧客の有効期限が最も早いアイテムを取得するためのクエリを実行する必要があります。
次の製品テーブルがあります。

PRODUCT
 |ID|NAME |EXPIRE_DATE|CUSTOMER_ID
  1 |p1   |2013-12-31 |1
  2 |p2   |2014-12-31 |1
  3 |p3   |2013-11-30 |2

そして、私は次の結果を得たいと思います:

|ID|EXPIRE_DATE|CUSTOMER_ID
 1 |2013-12-31 |1
 3 |2013-11-30 |2

Mysql では、次のようなクエリがあります。

 SELECT ID,min(EXPIRE_DATE),CUSTOMER_ID
 FROM PRODUCT
 GROUP BY CUSTOMER_ID

しかし、私は HyperSQL を使用していて、この結果を得ることができません。
HSQLDB を使用すると、次のエラーが発生しますjava.sql.SQLSyntaxErrorException: expression not in aggregate or GROUP BY columns: PRODUCT.ID
HyperSQLGROUP BY CUSTOMER_ID,IDで、元のテーブルと同じエントリを取得するように、クエリの最後の行を変更します。

HSQLDB を使用して、各顧客の有効期限が最も早い製品を計算するにはどうすればよいですか??

4

3 に答える 3

1

MySQL では、しばしば誤った結果をもたらす可能性がある非 ANSI グループを使用できます。HSQL は正しく動作しています。

2 つのオプションがあります。

IDを削除

SELECT min(EXPIRE_DATE),CUSTOMER_ID
 FROM PRODUCT
 GROUP BY CUSTOMER_ID

または、ID が EXPIRE_DATE で増加すると仮定すると、

SELECT MIN(ID),min(EXPIRE_DATE),CUSTOMER_ID
 FROM PRODUCT
 GROUP BY CUSTOMER_ID

ただし、IDが必要な場合は、JOINする必要があります

SELECT
     P.ID, P.EXPIRE_DATE, P.CUSTOMER_ID
FROM
     (
     SELECT min(EXPIRE_DATE) AS minEXPIRE_DATE,CUSTOMER_ID
     FROM PRODUCT
     GROUP BY CUSTOMER_ID
     ) X
     JOIN
     PRODUCT P ON X.minEXPIRE_DATE = P.EXPIRE_DATE AND X.CUSTOMER_ID = P.CUSTOMER_ID

ただし、HSQL は ANY 集計をサポートしていると思います。これにより、MIN/GROUP BY ごとに任意の ID が与えられます。

 SELECT ANY(ID),min(EXPIRE_DATE),CUSTOMER_ID
 FROM PRODUCT
 GROUP BY CUSTOMER_ID
于 2013-05-24T10:56:28.387 に答える
1

MySQL では、id顧客ごとに任意の値を取得しています。SQL の他のほとんどの方言では、必要な方言を指定する必要があります。これはうまくいきます:

SELECT min(ID), min(EXPIRE_DATE), CUSTOMER_ID
 FROM PRODUCT
 GROUP BY CUSTOMER_ID;

id最小の有効期限に関連付けられたを取得しようとしている場合、MySQL はそれを行っていません。これを行う 1 つの方法を次に示します。

select p.*
from Product p join
     (select customer_id, min(Expire_date) as min_ed
      from Product p
      group by customer_id
     ) psum
     on p.customer_id = psum.customer_id and p.Expire_date = psum.min_ed

これは標準の SQL であり、どのデータベースでも実行できます (ただし、一部のデータベースにはよりクリーンで効率的な機能があります)。

于 2013-05-24T10:57:41.657 に答える
0

サブクエリがサポートされていると仮定すると、次のようにテーブル自体を結合できます。

SELECT P.ID, P.EXPIRE_DATE, P.CUSTOMER_ID
FROM PRODUCT P
   JOIN (
       SELECT CUSTOMER_ID, MIN(EXPIRE_DATE) MIN_EXPIRE_DATE
       FROM PRODUCT
       GROUP BY CUSTOMER_ID
   ) P2 ON P.CUSTOMER_ID = P2.CUSTOMER_ID
        AND P.EXPIRE_DATE = P2.MIN_EXPIRE_DATE
于 2013-05-24T10:56:23.337 に答える