2016-07-02 31 views
0

所以,我有一个选择查询,它应该返回有超过3购买以及他们的购买的客户。例如,如果客户A有4次采购,我查询的结果应该包括这个客户和他的交易(4次采购)。但是有两次购买的顾客B不应该被包括在结果中,也不应该包括他的两次交易。我的查询需要很长时间,我需要在运行过程中停止查询(杀死它)。但是,我希望查询的结果具有要求(即3个购买限制)。换句话说,我希望那些将它们的事务插入到结果中的客户,但是由于中止,事务数目还不是3,因此要从结果中移除以保持需求。我正在考虑使用交易。但我不知道我该怎么做。这个例子显示了我想要的。想象一下,这是我原来的表:我可以使用事务处理来确保查询的结果与查询结果完全一致吗?

customer_id purchase_price 
    1   200 
    1   300 
    1   230 
    1   340 
    2   55 
    2   56 
    3   566 
    3   45 
    3   666 

我查询的期望的结果,如果它终止而不中断应该是这样的:

 customer_id purchase_price 
    1   200 
    1   300 
    1   230 
    1   340 
    3   566 
    3   45 
    3   666 

但不是这样的:

customer_id purchase_price 
    1   200 
    1   300 
    1   230 
    1   340 
    3   566 
    3   45 

在换句话说,如果程序在终止之前停止(程序在为客户3插入每个事务之前停止),我应该得到如下所示的结果:

customer_id purchase_price 
    1   200 
    1   300 
    1   230 
    1   340 
+1

用你正在使用的数据库标记你的问题。样本数据和期望的结果也很有帮助。 –

+0

@GordonLinoff我编辑了这个问题 – HimanAB

回答

0

大多数数据库都支持ANSI标准窗口函数。您可以直接做你想要使用它们的内容:

select t.* 
from (select t.*, count(*) over (partition by customer) as cnt 
     from transactions t 
    ) t 
where cnt >= 20; 

MySQL不支持这些功能。相反,你可以这样做:

select t.* 
from transactions t join 
    (select customer, count(*) 
     from transactions 
     group by customer 
     having count(*) >= 20 
    ) tc 
    on tc.customer = t.customer; 
+0

这是mysql查询吗? – HimanAB

+0

@HimanUCC。 。 。第二个是。 –

+0

我想知道你是否明白我想要的。我希望当我杀死查询(强制停止)时,结果只包括客户和他们至少有3次购买的交易(这是棘手的部分,客户将在结果中,但如果我停止查询) – HimanAB