我想检查具有相同ID(Product_ID)的记录是否具有多个具有不同日期的记录(我想检查产品是否在不同的战利品中或仅在一天内收到),所以如果它只返回一行,这意味着它在同一天被传递,如果不止一个结果返回它反过来。
表格产品
ID (PK) | Product_ID | Type | Deliver_Date | Amount
我已经尝过一个小组,并且没有结果。
编辑 :我到目前为止的查询......
SELECT DISTINCT ,
count(*)
FROM PUBLIC.product
WHERE product_id = ?
AND deliver_date = ?
HAVING count() = 1
答案 0 :(得分:4)
您对DISTINCT
关键字的使用不正确。
您可以将DISTINCT
与其后面的字段列表一起使用,告诉您要区分哪些字段,或使用COUNT
,SUM
,{{1与分组字段一起使用。
E.g。
MIN
表示“向我提供产品ID和交付日期的所有不同组合”。这实际上并不是您所需要的,因为SELECT DISTINCT Product_Id, Deliver_date
FROM ...
WHERE ...
只会告诉您哪些产品ID,但不知道它们中有多少以及在哪些日期,而DISTINCT Product_id
会为您提供所有可能的产品ID组合并提供日期,但您需要手动计算。
DISTINCT Product_id, Deliver_date
构造提供更多信息
GROUP BY
按产品ID对行进行分组。它告诉您每个产品ID有多少行。
但是,如果您有多个具有相同产品ID和相同日期的行,该怎么办?您将在该查询中获得大于1的数字,但它不会对您有所帮助,因为您希望区分在两天内交付的产品和在同一天交付的所有产品。
为此,您需要使用SELECT count(*), Product_Id
FROM ...
WHERE ...
GROUP BY Product_Id
:
COUNT(DISTINCT(Deliver_date))
这意味着:
*通过SELECT COUNT(DISTINCT(Deliver_date)), Product_ID
FROM ...
WHERE ...
GROUP BY Product_ID
将行分成组。
*在每个此类组(具有Product_ID
的所有行)内,找到所有不同的Product_ID
值。计算组内有多少个Deliver_Date
个值。
因此,如果产品在同一天内交付了10次,那么您只需拥有该产品ID的一个不同交货日期。 Delivery_Date
将返回1.如果在第x天发送了5次,在第y天发送了5次,那么您将有两个不同的发送日期(x和y),并且COUNT将返回2.
现在,如果要删除所有在同一天交付的内容(不同日期的计数为1),则在查询中添加COUNT
子句:
HAVING
这将为您提供至少在两个不同日期交付的所有产品的列表。
当然,如果您只是想检查特定产品是否在多个日期交付,则更简单:
SELECT COUNT(DISTINCT(Deliver_date)), Product_Id
FROM PRODUCT
GROUP BY Product_Id
HAVING COUNT(DISTINCT(Deliver_date)) > 1
这将为您提供此产品交付的不同天数。如果仅在一天内交付,结果将为1.如果超过一天交付,结果将是大于一的数字。
总结一下:
SELECT COUNT(DISTINCT(Deliver_date))
FROM PRODUCT
WHERE Product_ID = ?
这样的东西。 DISTINCT,
后面跟着一个或多个应该是不同的字段的名称。DISTINCT
计算字段在组或结果集中有多少个不同的值。