我发现在我的数据库中的不同日期捕获了重复的虚拟事件(卡片输出)。应按顺序捕获完整事件(卡入,引脚验证,输入提取金额,现金输出,卡输出)。我可以使用什么查询来查找具有这种情况的所有受影响的ATM(在按日期排序之后没有捕获完整事件),如何找出ATM捕获每个atm的虚拟卡输出事件的日期?我需要弄清楚机器在连续行中有卡出事件的日期(在每个卡出事件之间不包含其他事件)
select date, atm, event
from table
where atm = a
order by date desc
DATE ATM Event
24/10/2017 20:59 a Card out
22/10/2017 10:12 a Card out
20/10/2017 17:20 a Card out
17/10/2017 20:59 a Card out
17/09/2017 17:22 a Card out
17/09/2017 17:22 a Cash out
17/09/2017 17:21 a input withdraw amount
17/09/2017 17:20 a PIN verification
17/09/2017 17:20 a Card in
16/09/2017 17:22 a Cash out
16/09/2017 17:21 a input withdraw amount
16/09/2017 17:20 a PIN verification
16/09/2017 17:20 a Card in
答案 0 :(得分:0)
你的问题不明确,你是否在寻找类似的东西; (找到重复的ATM和事件字段)
select ATM,Event from Table group by ATM,Event having count(*) > 1
答案 1 :(得分:0)
SELECT * FROM table
WHERE (event = 'Card out' OR event = 'Card in') AND atm IN
(
SELECT t1.atm FROM
(
SELECT atm, COUNT(*) as count
FROM `table`
WHERE event = 'Card out'
GROUP BY ATM
) as t1
FULL JOIN
(
SELECT atm, COUNT(*) as count
FROM `table`
WHERE event = 'Card in'
GROUP BY ATM
) as t2
ON t1.ATM = t2.ATM
WHERE t1.COUNT > t2.COUNT
)
ORDER BY date
ORDER BY atm
这个查询的作用是首先计算每个ATM有多少卡片输出事件,然后计算每个atm的事件卡数量,并列出所有具有卡片输出事件而不是卡片事件的atm。然后使用有缺陷的atm列表列出所有相应的卡和卡出事件。
排序顺序将按照atm的顺序放置列表,并在每个atm内,按日期排序。然后,您可以使用该列表检查复制卡输出事件的位置,方法是在事件之前使用卡消除每个卡片输出事件。目前我不知道如何在SQL中执行此操作,但我可以使用其他编程语言轻松完成此操作。