当事件在某一天发生多次时查找详细信息

Posted

技术标签:

【中文标题】当事件在某一天发生多次时查找详细信息【英文标题】:Find details when an event happens more than once on a given day 【发布时间】:2020-11-25 05:23:56 【问题描述】:

我有一个简单的表来存储客户的交易。该表包含作为其主键的交易 ID、客户编号、交易日期和商品 ID。

我需要知道任何客户在某一天购买了超过 1 个不同的商品 ID。

所以在下表中,我希望只为客户 BBB 取回所有记录,因为他们在同一天有 2 个不同的项目 ID。所有 AAA 的 itemid 相同,而 CCC 则跨越 2 个不同的日子。

+---------+------------+------------+--------+ |转号 |客户 ID |日期 |项目 ID | +---------+------------+------------+--------+ | 1 | AAA | 2020 年 11 月 24 日 | 11 | | 2 | AAA | 2020 年 11 月 24 日 | 11 | | 3 | AAA | 2020 年 11 月 24 日 | 11 | | 4 |血脑屏障 | 2020 年 11 月 23 日 | 12 | | 5 |血脑屏障 | 2020 年 11 月 23 日 | 11 | | 6 | CCC | 2020 年 11 月 23 日 | 11 | | 7 | CCC | 2020 年 11 月 24 日 | 11 | +---------+------------+------------+--------+

我已经尝试过了,但它似乎返回了所有行...

select customerid, date, itemid
from transactions
group by customerid, date, itemid
having count(itemid) > 1

【问题讨论】:

从分组中删除项目。 我假设您希望 itemid 成为结果的一部分,对吧? 【参考方案1】:

使用count(distinct itemid) 并从group by clause 中删除the item field

Select customerid, date from transactions 
group by customerid, date
having count(distinct itemid) > 1

【讨论】:

【参考方案2】:
;WITH CTE AS (
SELECT *
,ROW_NUMBER() OVER(PARTITION BY  CUSTOMERID,DATE ORDER BY TEMID) AS RUN
FROM (
SELECT DISTINCT CUSTOMERID,DATE,TEMID 
from transactions) a)
SELECT B.CustomerId,B.Date,B.temId FROM CTE B inner join (
SELECT DISTINCT CUSTOMERid,DATE FROM CTE WHERE RUN > 1)C
ON B.CustomerId=C.CustomerId AND B.Date = C.Date

【讨论】:

【参考方案3】:

如果您希望 itemid 成为结果的一部分,这应该可以:

SELECT t.CustomerId, t.ItemId, t.Date
FROM(
     SELECT CustomerId, ItemId, COUNT(itemid) AS Trans
     FROM transactions
     GROUP BY CustomerId, ItemId
) AS a
JOIN transactions t
    ON t.CustomerId = a.CustomerId
    AND t.ItemId <> a.ItemId

【讨论】:

以上是关于当事件在某一天发生多次时查找详细信息的主要内容,如果未能解决你的问题,请参考以下文章

evevt

如果在文档加载后运行,事件侦听器会收到空详细信息

熵——自信息

如何从EventMessageFile(.dll)中读取事件消息详细信息? [重复]

MySQL根据条件多次加入

更改 Woocommerce 结帐端点以显示订单摘要详细信息