需要SQL Server查询帮助
我正在一个视图中存储一组数据(将MS Access查询转换为视图)。现在我要做的是编写一个存储过程,根据添加数据的时间提取数据。这是我正在运行的查询需要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
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