在SQL server中获取所需的输出

在SQL server中获取所需的输出,sql,sql-server,Sql,Sql Server,我在获取以下场景所需的输出时遇到问题 name | provider | visit_dt | rd | rn A | 100000 | 06/05/'17 | 1 | 1 A | 100001 | 06/04/'17 | 1 | 0 A | 100001 | 06/03/'17 | 1 | 0 B | 100000 | 06/05/'17 | 1 | 0 B | 100001 | 06/05

我在获取以下场景所需的输出时遇到问题

name | provider  | visit_dt    | rd | rn  
 A   | 100000    | 06/05/'17   | 1  |  1
 A   | 100001    | 06/04/'17   | 1  |  0
 A   | 100001    | 06/03/'17   | 1  |  0
 B   | 100000    | 06/05/'17   | 1  |  0
 B   | 100001    | 06/05/'17   | 1  |  1
 C   | 100000    | 06/05/'17   | 1  |  0
 C   | 100001    | 06/04/'17   | 1  |  0
 C   | 100001    | 06/03/'17   | 1  |  1
 D   | 100001    | 06/05/'17   | 1  |  0
 D   | 100001    | 06/04/'17   | 1  |  0
这里有4种不同的场景:

如果最近访问的用户的rd=1和rn=1,则将最近访问的用户拉到A 获得rn=1人C的每个人的最近就诊 如果rn=0,则拉动最近的RD人员D 如果一个人的两次访问在同一天与不同的提供者进行,则无论rd和rn值如何,都会拉取这两个提供者 因此,预期输出应如下所示

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
如果有人能帮我解决这个问题,那就太好了

任何建议都是值得考虑的


提前感谢您。

如果这是SQL 2008+,我相信只要访问是日期数据类型,它就可以工作

WITH cte1 AS (
  SELECT name, provider, visit_dt, rd, rn, DENSE_RANK() OVER (PARTITION BY name ORDER BY visit_dt DESC) AS thisrow
  FROM t
)
SELECT * 
FROM cte1 
WHERE thisrow =1

看起来你遇到了一些矛盾的情况我的方法是:

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)

访问是日期/时间吗?还是短信?请澄清3,在我看来B也是一个正确的回答。在所有情况下,每个名称是否至少有两行?是的,访问数据类型为日期。。其余的列都是varchar。每个名字在输出中应该只显示一次,但是B个人在访问日期相同但提供者不同的情况下会显示两次。实际上,我认为这可能是因为纯粹的愚蠢运气。我会仔细检查它,确保它符合您的所有规则。嗨,谢谢您的解决方案。有了这个,我就能够在两个提供者的输出中得到人物B。但是,对于C个人来说,最近的访问被拉取,而不是rn=1的访问。我试着使用SELECT*,按名称顺序按RD+RN DESC在分区上按行编号,从A中按R访问,其中R=1,这给了我上述所有场景,但它丢失了在相同访问日期有2个提供者的人员B的一个记录。你能帮我做点什么吗?@Mamtha C被证明是有问题的。如果我排除了任何不是C的结果的东西,它就会消除一些其他有效的结果。其他结果方法将包括C的第一条记录。C规则的问题是,其他规则包括不应该匹配的来自C的结果。我认为1和4是矛盾的,但它们有更多的重叠。我仍然无法在不打破其他逻辑的情况下使规则2的逻辑匹配。我上面的解决方案似乎可以处理规则1、3和4,但不能处理规则2。你能再次确认这些规则是你需要的吗?嗨,谢谢。。但是这缺少了有两个提供者的人B。它只给出了一个记录“如果一个人的两次访问在同一天与不同的提供商进行,那么无论rd和rn值如何,都会将两个提供商拉到B个人”。你介意帮我把这个也写进我的输出吗?@Mamtha是的,有些条件可能会冲突,比如1和4。如果一个人最近一天有两次就诊,但一次就诊是rn=1,rd=1,另一次是rn=0,rd=1,会发生什么情况?我们是两个都选还是只选1/1记录?看看你的预期结果,我们似乎会同时返回这两个记录。因此,1/1将由规则1拾取,1/0将由规则4拾取。对吗?而且C个人没有接受最近的访问,因为有1/1的记录。这是正确的流程吗?如果某个人已经有了更高的匹配项,是否将其排除在外?或者这是一个错误的测试?