需要SQL Server查询帮助

需要SQL Server查询帮助,sql,sql-server,select,union,union-all,Sql,Sql Server,Select,Union,Union All,我正在一个视图中存储一组数据(将MS Access查询转换为视图)。现在我要做的是编写一个存储过程,根据添加数据的时间提取数据。这是我正在运行的查询 Select Name, PlanID, ApptDate, 1stAppt, rn, from (Select *, row_number() over (partition by PlanID Order BY AddedonDate desc) as rn From

我正在一个视图中存储一组数据(将MS Access查询转换为视图)。现在我要做的是编写一个存储过程,根据添加数据的时间提取数据。这是我正在运行的查询

Select 
    Name, PlanID, ApptDate, 1stAppt, rn, 
from 
    (Select 
         *,   
         row_number() over (partition by PlanID Order BY AddedonDate desc) as rn 
     From vClientInfo)
所以这把我所有的数据都拉出来了。我必须解决的问题是,客户机实际上是为第一次应用和第二次应用而来的-基本上,我需要提取最新日期和最早日期的数据,并在查询中包含“2ndAppt”。因此,1stAppt和2ndAppt保存了一个字符串值,我稍后将使用它…这两个值可能在1stAppt和2ndAppt之间有所不同-只有AddedOn date会告诉我是否有不同的值(最早的为1stAppt,最晚的为2ndAppt)

所以我做了这个,我改变了这个

(Select *,  row_number() over (partition by PlanID Order BY AddedonDate *ASC*)
但是,我不确定这是否提取了正确的数据,因为我正在处理大量数据,而且很难验证。所以基本上我需要进行一个联合,这样我的两个查询都能得到正确的数据。最初我得到了1920张唱片,所以有了工会,我想我也应该得到同样多的唱片,然而,这个数字是原来的两倍,所以是3840张,为什么

Select 
    Name, PlanID, ApptDate, 1stAppt, 2ndappt, rn, 
From 
    (Select 
         *,   
         row_number() over (partition by PlanID Order BY AddedonDate desc) as rn 
     From  vClientInfo

     Union All

     Select 
         Name, PlanID, ApptDate, 1stAppt, 2ndAppt, rn, 
     From 
         (Select 
              *,  
              row_number() over (partition by PlanID Order BY AddedonDate asc) as rn 
          From vClientInfo

您使用的是窗口函数,但不是按它进行过滤,这有什么意义?如果您想要最早的和最新的,请选择rn=1:

Select Name, PlanID, ApptDate, 1stAppt,2ndappt, rn,
from (Select *,
            row_number() over (partition by PlanID Order BY AddedonDate desc) as rn
     from  vClientInfo
     Union All
     Select *, 
           row_number() over (partition by PlanID Order BY AddedonDate asc) as rn 
     from  vClientInfo)
WHERE rn = 1
如果您希望从最早开始第一次申请,从最晚开始第二次申请:

Select Name, PlanID, ApptDate,
       MAX(CASE WHEN rnk = 1 then 1stAppt end) as 1stAppt,
       MAX(CASE WHEN rn = 1 THEN 2ndappt end) as 2ndAppt
from (Select *,
            row_number() over (partition by PlanID Order BY AddedonDate desc) as rn,
     0 as rnk
     from  vClientInfo
     Union All
     Select *,
           0 as rn,
           row_number() over (partition by PlanID Order BY AddedonDate asc) as rnk 
     from  vClientInfo)
GROUP BY Name,PlanID,ApptDate

您的查询不会运行。
Select Name, PlanID, ApptDate,
       MAX(CASE WHEN rnk = 1 then 1stAppt end) as 1stAppt,
       MAX(CASE WHEN rn = 1 THEN 2ndappt end) as 2ndAppt
from (Select *,
            row_number() over (partition by PlanID Order BY AddedonDate desc) as rn,
     0 as rnk
     from  vClientInfo
     Union All
     Select *,
           0 as rn,
           row_number() over (partition by PlanID Order BY AddedonDate asc) as rnk 
     from  vClientInfo)
GROUP BY Name,PlanID,ApptDate