仅从表中的多个字段返回异常
Posted
技术标签:
【中文标题】仅从表中的多个字段返回异常【英文标题】:Only return exceptions from multiple fields in a table 【发布时间】:2020-08-27 06:50:25 【问题描述】:我有存储零售交易的表(交易)。我希望能够找到几个字段的独特组合。我有一个存储交易类型(在线或商店)和客户姓名、周数和产品类型的表。我需要找到共享相同客户、周和产品的在线或商店交易,但前提是没有来自其他交易类型的相应交易。请参阅下面的示例...
+------------------+---------+------+------------ --+ |交易类型 |客户 |周 |产品_类型 | +------------------+---------+------+------------ --+ |在线 | 123 | 1 |服装 | +------+---------+------+------------ --+ |商店 | 123 | 1 |家居用品 | +------------------+---------+------+------------ --+ |在线 | 123 | 1 |家居用品 | +------+---------+------+------------ --+ |在线 | 123 | 2 |服装 | +------+---------+------+------------ --+ |商店 | 123 | 2 |服装 | +------------------+---------+------+------------ --+ |在线 | 123 | 2 |体育 | +------+---------+------+------------ --+ |在线 | 345 | 2 |服装 | +------------------+---------+------+------------ --+ |商店 | 345 | 2 |家居用品 | +------------------+---------+------+------------ --+ |在线 | 345 | 2 |家居用品 | +------+---------+------+------------ --+ |在线 | 345 | 2 |服装 | +------------------+---------+------+------------ --+ |商店 | 345 | 2 |家居用品 | +------------------+---------+------+------------ --+ |在线 | 345 | 2 |体育 | +------+---------+------+------------ --+从这里我想看到以下返回...
+------------------+---------+------+------------ --+ |交易类型 |客户 |周 |产品_类型 | +------------------+---------+------+------------ --+ |在线 | 123 | 1 |服装 | +------+---------+------+------------ --+ |在线 | 123 | 2 |服装 | +------+---------+------+------------ --+ |在线 | 345 | 2 |服装 | +------------------+---------+------+------------ --+ |在线 | 345 | 2 |服装 | +------------------+---------+------+------------ --+ |在线 | 345 | 2 |服装 | +------------------+---------+------+------------ --+ |商店 | 345 | 2 |家居用品 | +------------------+---------+------+------------ --+ |在线 | 345 | 2 |体育 | +------------------+---------+------+------------ --+其他交易被排除在外,因为 Online 和 Store 的 customer、week 和 product_type 值相同。
我目前的代码是这样的......
select * from transactions
group by customer, week, product_type
having count(customer, week, product_type) <> 2
但我认为我应该使用分区,但我不知道如何。
谢谢
【问题讨论】:
【参考方案1】:你可以使用not exists
:
select t.*
from transactions t
where not exists (
select 1
from transactions t1
where
t1.customer = t.customer
and t1.week = t.week
and t1.product = t.product
and t1.transaction_type <> t.transaction_type
)
【讨论】:
以上是关于仅从表中的多个字段返回异常的主要内容,如果未能解决你的问题,请参考以下文章