Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何在数据库中删除5分钟内取消的订单记录?_Sql_Postgresql - Fatal编程技术网

Sql 如何在数据库中删除5分钟内取消的订单记录?

Sql 如何在数据库中删除5分钟内取消的订单记录?,sql,postgresql,Sql,Postgresql,我有用户购买行为的记录。但是,它很长,包含大量冗余数据。我想删除在5分钟内购买并删除的订单 到目前为止,我的问题是: --表3化学需氧量 select z.user_id, z.date, z.actions, x.name, x.email, x.address sum(z.debit) over (partition by z.seller_id order by z.created_at) -

我有用户购买行为的记录。但是,它很长,包含大量冗余数据。我想删除在5分钟内购买并删除的订单

到目前为止,我的问题是: --表3化学需氧量

select z.user_id,
       z.date,
       z.actions,
       x.name,
       x.email,
       x.address
       sum(z.debit) over (partition by z.seller_id order by z.created_at) - 
          sum(z.credit) over (partition by z.seller_id order by z.created_at) 
as balance
from table_1 z

left join

table_2 x

on z.seller_id = x.uid
order by seller_id, created_at
为了简单起见,我得到了这个结果

user    actions        credit debit  balance     date
 1    do_action_A      5000    0      5000      2020-01-01 1:00:00     #no need these 2
 1    cancel_A          0     5000      0       2020-01-01 1:03:00     #in result
 1    do_action_A      5000    0      5000      2020-01-01 1:10:00
 1    do_action_b      3000    0      8000      2020-01-01 1:20:00
 1    do_action_c       0     7000    1000      2020-01-01 1:30:00

 2    do_action_A      5000    0      5000      2020-01-01 1:00:00
 2    do_action_B      3000    0      8000      2020-01-01 1:10:00
我们知道用户只能在5分钟内取消订单,不幸的是,取消的次数很多。我需要使这个数据表简单和简短,以便跟踪和可视化它容易

这是我的期望:

user    actions        credit debit  balance     date

 1    do_action_A      5000    0      5000      2020-01-01 1:10:00
 1    do_action_b      3000    0      8000      2020-01-01 1:20:00
 1    do_action_c       0     7000    1000      2020-01-01 1:30:00

 2    do_action_A      5000    0      5000      2020-01-01 1:00:00
 2    do_action_B      3000    0      8000      2020-01-01 1:10:00
您可以尝试使用lead()


为每个查询命中SQL将非常昂贵。我的建议是在您的服务和数据库之间使用直写缓存来处理快速写入。@Seema,确实很昂贵,这就是为什么,我在考虑表中的小数据我通常还有两列来识别取消的订单,如
isCancelled=1
和cancellation\u id=1234您要做的是查询昂贵的操作,我建议你们找到解决办法。若用户购买了两次并取消了第一次呢one@DervişKayımbaşıoğlu,那么,在这种情况下有什么建议吗?如果是这样的话,这个问题就行不通了。因此,它不能被接受为答案。正如我在问题中已经建议的那样,您需要有isCancelled和CancellationId
select * from
(
select z.user_id,z.date,z.actions,x.name,
       x.email,x.address,debtit, credit, balance,
lead(z.actions) over(parition by z.user_id order by z.created_at) as next_action
from table_1 z left join table_2 x
on z.seller_id = x.uid
)A where next_action not like '%cancel%' and actions not like '%cancel%'