检查数据库中具有相同ID的记录是否在字段中具有不同的值
Check whether a record in DB with same ID has different value in field
我想检查具有相同 ID (Product_ID) 的记录是否有多个不同日期的记录(我想检查产品是在不同的战利品中收到的还是仅在一天),所以如果它只有 return 一行,则意味着它是同一天交付的,如果不止一个结果是 return,则相反。
Table 产品
ID (PK) | Product_ID | Type | Deliver_Date | Amount
我试过使用 group by 和 distinct 没有结果。
编辑:我到目前为止的查询...
SELECT DISTINCT ,
count(*)
FROM PUBLIC.product
WHERE product_id = ?
AND deliver_date = ?
HAVING count() = 1
您使用的 DISTINCT
关键字不正确。
您可以使用 DISTINCT
及其后面的字段列表,告诉您希望哪些字段不同,或者使用聚合函数,例如 COUNT
、SUM
、MIN
等以及分组字段。
例如
SELECT DISTINCT Product_Id, Deliver_date
FROM ...
WHERE ...
表示"give me all the distinct combinations of product id and deliver date"。这实际上并不是您所需要的,因为 DISTINCT Product_id
只会告诉您有哪些产品 ID,但不会告诉您有多少以及在哪些日期,而 DISTINCT Product_id, Deliver_date
会为您提供所有可能的产品 ID 组合和交货日期,但您需要手动计算它们。
GROUP BY
结构提供更多信息
SELECT count(*), Product_Id
FROM ...
WHERE ...
GROUP BY Product_Id
按产品 ID 对行进行分组。它告诉您每个产品 ID 有多少行。
但是,如果您有几行具有相同的产品 ID 和相同的日期怎么办?您将在该查询中得到一个大于 1 的数字,但这对您没有帮助,因为您想要区分在两个不同日期交付的产品和在同一天交付的所有产品。
为此,您需要使用 COUNT(DISTINCT(Deliver_date))
:
SELECT COUNT(DISTINCT(Deliver_date)), Product_ID
FROM ...
WHERE ...
GROUP BY Product_ID
这意味着:
* 用 Product_ID
将行分隔成组。
* 在每个这样的组中(所有具有 Product_ID
的行),找到所有不同的 Deliver_Date
值。计算组内有多少这样的 Delivery_Date
值。
因此,如果该产品在同一天内交付了 10 次,则该产品 ID 将只有一个不同的交付日期。 COUNT
将 return 1. 如果它在第 x 天交付了 5 次,在第 y 天交付了 5 次,那么您将有 两个 个不同的交付日期(x 和 y),COUNT 将 return 2.
现在,如果您想消除所有在同一天交付的(不同日期的计数为 1),您可以在查询中添加一个 HAVING
子句:
SELECT COUNT(DISTINCT(Deliver_date)), Product_Id
FROM PRODUCT
GROUP BY Product_Id
HAVING COUNT(DISTINCT(Deliver_date)) > 1
这将为您提供至少在两个不同日期交付的所有产品的列表。
当然,如果您只想检查某个特定产品是否在多个日期交付,则更简单:
SELECT COUNT(DISTINCT(Deliver_date))
FROM PRODUCT
WHERE Product_ID = ?
这将为您提供该产品交付的不同天数。如果仅一天送达,结果将为 1。如果超过一天送达,结果将为大于 1 的数字。
总结一下:
- 没有
DISTINCT,
这样的东西。 DISTINCT
后面总是跟一个或多个应该不同的字段的名称。
- 但是有一个
COUNT(DISTINCT(field_name))
计算字段在组或结果集中有多少个不同的值。
我想检查具有相同 ID (Product_ID) 的记录是否有多个不同日期的记录(我想检查产品是在不同的战利品中收到的还是仅在一天),所以如果它只有 return 一行,则意味着它是同一天交付的,如果不止一个结果是 return,则相反。
Table 产品
ID (PK) | Product_ID | Type | Deliver_Date | Amount
我试过使用 group by 和 distinct 没有结果。
编辑:我到目前为止的查询...
SELECT DISTINCT ,
count(*)
FROM PUBLIC.product
WHERE product_id = ?
AND deliver_date = ?
HAVING count() = 1
您使用的 DISTINCT
关键字不正确。
您可以使用 DISTINCT
及其后面的字段列表,告诉您希望哪些字段不同,或者使用聚合函数,例如 COUNT
、SUM
、MIN
等以及分组字段。
例如
SELECT DISTINCT Product_Id, Deliver_date
FROM ...
WHERE ...
表示"give me all the distinct combinations of product id and deliver date"。这实际上并不是您所需要的,因为 DISTINCT Product_id
只会告诉您有哪些产品 ID,但不会告诉您有多少以及在哪些日期,而 DISTINCT Product_id, Deliver_date
会为您提供所有可能的产品 ID 组合和交货日期,但您需要手动计算它们。
GROUP BY
结构提供更多信息
SELECT count(*), Product_Id
FROM ...
WHERE ...
GROUP BY Product_Id
按产品 ID 对行进行分组。它告诉您每个产品 ID 有多少行。
但是,如果您有几行具有相同的产品 ID 和相同的日期怎么办?您将在该查询中得到一个大于 1 的数字,但这对您没有帮助,因为您想要区分在两个不同日期交付的产品和在同一天交付的所有产品。
为此,您需要使用 COUNT(DISTINCT(Deliver_date))
:
SELECT COUNT(DISTINCT(Deliver_date)), Product_ID
FROM ...
WHERE ...
GROUP BY Product_ID
这意味着:
* 用 Product_ID
将行分隔成组。
* 在每个这样的组中(所有具有 Product_ID
的行),找到所有不同的 Deliver_Date
值。计算组内有多少这样的 Delivery_Date
值。
因此,如果该产品在同一天内交付了 10 次,则该产品 ID 将只有一个不同的交付日期。 COUNT
将 return 1. 如果它在第 x 天交付了 5 次,在第 y 天交付了 5 次,那么您将有 两个 个不同的交付日期(x 和 y),COUNT 将 return 2.
现在,如果您想消除所有在同一天交付的(不同日期的计数为 1),您可以在查询中添加一个 HAVING
子句:
SELECT COUNT(DISTINCT(Deliver_date)), Product_Id
FROM PRODUCT
GROUP BY Product_Id
HAVING COUNT(DISTINCT(Deliver_date)) > 1
这将为您提供至少在两个不同日期交付的所有产品的列表。
当然,如果您只想检查某个特定产品是否在多个日期交付,则更简单:
SELECT COUNT(DISTINCT(Deliver_date))
FROM PRODUCT
WHERE Product_ID = ?
这将为您提供该产品交付的不同天数。如果仅一天送达,结果将为 1。如果超过一天送达,结果将为大于 1 的数字。
总结一下:
- 没有
DISTINCT,
这样的东西。DISTINCT
后面总是跟一个或多个应该不同的字段的名称。 - 但是有一个
COUNT(DISTINCT(field_name))
计算字段在组或结果集中有多少个不同的值。