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.
如果在 HyperSQL 中我修改查询的最后一行,就像GROUP 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,则必须重新加入

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

id在 MySQL 中,您可以为每个客户获取任意值。在大多数其他 SQL 方言中,您需要指定所需的方言。这将起作用:

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

如果您试图获取id与最小过期日期相关联的数据,那么 MySQL 不会这样做。这是执行此操作的一种方法:

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 回答