在SQL Server中获取所需的输出

时间:2017-06-05 21:59:33

标签: sql sql-server

我在获取以下方案所需的输出时遇到问题。

name | provider  | visit_dt    | rd | rn
A    | 100000    | 06/05/'17   | 1  |  1
B    | 100000    | 06/05/'17   | 1  |  0
B    | 100001    | 06/05/'17   | 1  |  1
C    | 100001    | 06/03/'17   | 1  |  1
D    | 100001    | 06/05/'17   | 1  |  0

这里有4种不同的场景:

  1. 如果最近有rd = 1且rn = 1则拉最近一次访问(A人)
  2. 以rn = 1(人C)
  3. 获取每个人的最近一次访问
  4. 如果rn = 0,则拉出最近的RD(人D)
  5. 如果一个人的访问次数在同一日期与不同的提供者进行,那么无论rd和rn值如何(同一个人B),都要同时提取两个提供者
  6. 所以预期的输出应该如下。

    Var Bit
    System::Call "kernel32::GetCurrentProcess()i.s"
    System::Call "kernel32::IsWow64Process(is,*i.r0)"
    StrCmpS $0 0 +3
    StrCpy $Bit 64
    Goto +2
    StrCpy $Bit 32
    

    如果有人能帮助我解决这个问题,那将会很棒。

    任何建议都会令人感激。

    提前谢谢。

2 个答案:

答案 0 :(得分:1)

如果这是SQL 2008+,我相信这会有效(只要visit_dt是日期数据类型)。

0:00:02.798704
0:00:02.940005
0:00:03.039798

http://dbfiddle.uk/?rdbms=sqlserver_2014&fiddle=1dc1bf626aed520d601fe68f1f11be55

答案 1 :(得分:0)

这看起来你的方法有些矛盾:

Select * from (
    Select *, Con1 = Row_Number() over(Partition by [name] order by visit_dt desc) ,
            Con2 = Row_Number() over(partition by [name],[rn] order by visit_dt desc)
    from yourVisits
    ) a
    Where  (a.Con1 = 1 and rd =1 and rn = 1)
        or (a.Con2 = 1 and rn=1)
        or (a.Con2 = 1 and rn=0)