如何查找同一个账号ID(不管属于什么状态)在同一日期有多个状态的所有记录,时间不重要,但日期很重要
预期结果应如下表所述,我应该选择同一帐户 ID 在同一天具有多个状态的数据
账户ID | 状态 | 上次更新时间戳 |
---|---|---|
12345 | DISB | 2023-09-07 06:30:30.000 |
12345 | 设置 | 2023-09-07 06:34:30.000 |
32341 | 雷布 | 2023-09-07 14:30:30.000 |
32341 | D | 2023-09-07 15:31:30.000 |
52355 | 设置 | 2023-09-09 14:30:30.000 |
52355 | D | 2023-09-09 15:31:30.000 |
样本表数据:
Create table PaymentRecord(
accountid BIGINT,
Status varchar(10),
lastupdatedTimestamp DATETIME
)
INSERT INTO PaymentRecord (accountid,Status,lastupdatedTimestamp) VALUES(12345, 'DISB','2023-09-07 16:30:30.000')
INSERT INTO PaymentRecord (accountid,Status,lastupdatedTimestamp) VALUES(12345, 'SET', '2023-09-07 16:34:30.000')
INSERT INTO PaymentRecord (accountid,Status,lastupdatedTimestamp) VALUES(12346, 'D', '2023-09-07 11:30:30.000')
INSERT INTO PaymentRecord (accountid,Status,lastupdatedTimestamp) VALUES(22341, 'CLR', '2023-09-08 13:30:30.000')
INSERT INTO PaymentRecord (accountid,Status,lastupdatedTimestamp) VALUES(32341, 'REB', '2023-09-08 14:30:30.000')
INSERT INTO PaymentRecord (accountid,Status,lastupdatedTimestamp) VALUES(32341, 'D', '2023-09-08 15:31:30.000')
INSERT INTO PaymentRecord (accountid,Status,lastupdatedTimestamp) VALUES(42325, 'CLR', '2023-09-09 11:30:30.000')
INSERT INTO PaymentRecord (accountid,Status,lastupdatedTimestamp) VALUES(52355, 'SET', '2023-09-09 14:30:30.000')
INSERT INTO PaymentRecord (accountid,Status,lastupdatedTimestamp) VALUES(52355, 'D', '2023-09-09 15:31:30.000')
INSERT INTO PaymentRecord (accountid,Status,lastupdatedTimestamp) VALUES(52355, 'SK', '2023-09-10 16:31:30.000')
我尝试了以下方法,但没有达到预期的结果。
select distinct
AccountId
, Status
, convert(date, LastUpdatedTimestamp)
from PaymentRecord
where LastUpdatedTimestamp between '2023-09-07' and '2023-09-11'
Order by
AccountId
, convert(date, LastUpdatedTimestamp)
, Status desc
我花了一段时间才明白你的问题。
但是用你的
WHERE
我无法重现你想要的结果。
这个概念很简单,进行子选择,您可以在某个日期获得多个状态的条件的帐户 ID 和日期,并将其加入到主查询中。
select p1.AccountId
,convert(date,p1.LastUpdatedTimestamp),Status
from PaymentRecord p1
JOIN
(SELECT AccountId,convert(date,LastUpdatedTimestamp) as LastUpdatedTimestamp
FROM PaymentRecord
where LastUpdatedTimestamp between '2023-09-08' and '2023-09-11'
GROUP BY AccountId,convert(date,LastUpdatedTimestamp)
HAVING COUNt(DISTINCT Status) > 1) p2
ON p1.AccountId = p2.AccountId AND convert(date,p1.LastUpdatedTimestamp) = p2.LastUpdatedTimestamp
Order by p1.AccountId, p1.LastUpdatedTimestamp,Status desc
账户ID | (无栏名) | 状态 |
---|---|---|
32341 | 2023-09-08 | 雷布 |
32341 | 2023-09-08 | D |
52355 | 2023-09-09 | 设置 |
52355 | 2023-09-09 | D |
您可以使用
EXISTS
:
SELECT *
FROM PaymentRecord pr1
WHERE EXISTS (
SELECT *
FROM PaymentRecord pr2
WHERE pr1.AccountId = pr2.AccountId
AND pr1.Status <> pr2.Status
AND CAST(pr1.lastupdatedTimestamp AS DATE) = CAST(pr2.lastupdatedTimestamp AS DATE)
)
AND pr1.lastupdatedTimestamp BETWEEN '2023-09-07' AND '2023-09-11'