2015-03-31 20 views
0

我有一个由ClientID,ActionDate,Action和Result组成的表。MS SQL如何选择最后N个记录相同的客户端

我需要选择具有特定日期范围内的特定操作/结果组合的不同客户端。

举例说明:

  1. 我需要不同的clientId,其最近5动作/结果是呼叫/无应答。
  2. 我需要在过去30天内只有Call/NoAnswer的独特clientID。

感谢

+2

你试过这么远吗? – 2015-03-31 12:27:35

+0

表的主键是什么?此外,最后5包括或不包括这? – 2015-03-31 12:34:52

+0

我有麻烦设置“Where”子句。如果我将其设置为特定的操作/结果,它只会计算这些操作。我应该建立的查询逻辑并没有在我的脑海中清理。 也许有几个子选择,它们会选择Top1,Top2-Top1,Top3-(Top2-top1)等,它们应该都是相同的。我相信有更优雅的方式,但我太新手了,能够弄清楚。 – Peraklo 2015-03-31 12:39:48

回答

2

1.

select ClientID from 
(
select 
    ClientID, 
    Action, 
    Result, 
    row_number() over (partition by ClientID order by ActionDate desc) as num 
from ClientActions 
) T -- the latest 5 action/result 
where rnum <= 5 
group by ClientID 
having MAX(case when Action='Call' and Result = 'NoAnswer' then 0 else 1 end) = 0 

2.

select ClientID 
from ClientActions 
where DATEDIFF(DAY, ActionDate, GETDATE()) <= 30 
group by ClientID 
having MAX(case when Action='Call' and Result = 'NoAnswer' then 0 else 1 end) = 0 
+0

第一个像魅力一样工作,谢谢。我现在必须分析它,并试图充分理解它,以备将来参考。 至于第二个,这将采取只有最后一次行动的客户,对吧?如果我希望在上个月的所有操作都是Call/NoAnswer,该怎么办?我想我将不得不删除MAX? – Peraklo 2015-03-31 13:17:22

+0

@Peraklo,与MAX的第二个查询应采取在上个月的所有操作等于Call/NoAnswer的客户端。你可以很容易地测试它 – ASh 2015-03-31 13:50:12

相关问题