Sql 使用同一select语句中的N动态选择top N
我有一个程序,尝试在表中为每个代理插入样本,每个代理的样本数量根据某些计算而变化Sql 使用同一select语句中的N动态选择top N,sql,sql-server,tsql,sql-server-2005,Sql,Sql Server,Tsql,Sql Server 2005,我有一个程序,尝试在表中为每个代理插入样本,每个代理的样本数量根据某些计算而变化 Declare @samplesize int Declare @Top int set @samplesize=0 ;WITH DataToInsert AS ( Select AgentID, Surveys, LOB,(case when day(getdate())<4 then 3 else (day(getdate())) - (Surveys*3) end) SampleSize fr
Declare @samplesize int
Declare @Top int
set @samplesize=0
;WITH DataToInsert AS
(
Select AgentID, Surveys, LOB,(case when day(getdate())<4 then 3 else (day(getdate())) - (Surveys*3) end) SampleSize from Current_Agent_SurveyCount_HSI Where surveys<8
)
--Insert Into Survey_Source_New (LOB, CenterName, CallDate, AgentZid, TN, Ticket, RecordingID, Cycle, [TimeStamp])
--Select top 5 ss.LOB, CenterName, CallDate, AgentZid, TN, Ticket, RecordingID, Cycle, [TimeStamp]
--From Survey_source_Level1 ss
--inner join DataToInsert du on ss.AgentZID=du.agentID
--where flag is null and du.samplesize>6
--order by newid()
Insert Into Survey_Source_New (LOB, CenterName, CallDate, AgentZid, TN, Ticket, RecordingID, Cycle, [TimeStamp])
Select top (@Top) @Top=du.samplesize,ss.LOB, CenterName, CallDate, AgentZid, TN, Ticket, RecordingID, Cycle, [TimeStamp]
From Survey_source_Level1 ss
inner join DataToInsert du on ss.AgentZID=du.agentID
where flag is null and du.samplesize<7
order by newid()
我在这里得到的错误是
Msg 4115,第15级,状态1,第4行
TOP子句的参数中不允许引用列samplesize。仅在外部位置引用列
此处允许范围或独立表达式和子查询
有解决办法吗
感谢您的帮助
提前感谢。您可以使用row\u number执行基本相同的操作:
WITH DataToInsert AS
(
Select AgentID, Surveys, LOB,(case when day(getdate())<4 then 3 else (day(getdate())) - (Surveys*3) end) SampleSize from Current_Agent_SurveyCount_HSI Where surveys<8
)
Insert Into Survey_Source_New (LOB, CenterName, CallDate, AgentZid, TN, Ticket, RecordingID, Cycle, [TimeStamp])
select LOB, CenterName, CallDate, AgentZid, TN, Ticket, RecordingID, Cycle, [TimeStamp]
from (Select ss.LOB, CenterName, CallDate, AgentZid, TN, Ticket, RecordingID, Cycle, [TimeStamp],
row_number() over (order by newid()) as seqnum
From Survey_source_Level1 ss inner join
DataToInsert du on ss.AgentZID=du.agentID
where flag is null and du.samplesize<7
) t
where seqnum <= du.sample_size
你也许可以简化一下,但我不知道flag是来自du还是ss。我在同一个问题上增加了一个场景。 我对现有解决方案做了一些更改,场景是: 我每天都会收到一份代理名单,并向每个代理发送一组随机调查,数量取决于每个代理的计算结果
--Get Agent List
;WITH AgentsList AS
(
Select AgentID, Surveys, LOB,(case when day(getdate())<4 then 3 else (day(getdate())) - (Surveys*3) end) SampleSize
from Current_Agent_SurveyCount_FIOS Where surveys<8
)
--Get All the Surveys for each Agent
, AgentSurveys AS
(
select ss.LOB, ss.CenterName, ss.CallDate, ss.AgentZid, ss.TN, ss.Ticket, ss.RecordingID, ss.Cycle, ss.[TimeStamp],ss.Flag,AL.samplesize
from Survey_Source_Level1_Sri ss
inner join AgentsList AL on ss.AgentZID=AL.agentID
where flag is null
GROUP BY ss.LOB, ss.CenterName, ss.CallDate, ss.AgentZid, ss.TN, ss.Ticket, ss.RecordingID, ss.Cycle, ss.[TimeStamp],ss.Flag,AL.samplesize
)
--Mark random ranking for each survey
Select LOB, CenterName, CallDate, AgentZid, TN, Ticket, RecordingID, Cycle, [TimeStamp],samplesize,
rank() over (partition by agentzid order by newid()) as seqnum
From AgentSurveys
group by LOB, CenterName, CallDate, AgentZid, TN, Ticket, RecordingID, Cycle, [TimeStamp],samplesize
order by agentzid,seqnum,tn
现在,从上一个查询中,我得到一个如下表
我需要每个组的N行数,其中N来自SampleSize列。选择LOB、CenterName、CallDate、AgentZid、TN、Ticket、RecordingID、Cycle、[TimeStamp]、SampleSize、seqnum从选择LOB、CenterName、CallDate、AgentZid、TN、Ticket、RecordingID、Cycle、[TimeStamp]、SampleSize、,按agentzid按分区排序按newid按LOB、CenterName、CallDate、agentzid、TN、Ticket、RecordingID、Cycle、[TimeStamp],samplesize t从AgentServeys组中按seqnum排序按seqnum排序按LOB、CenterName、CallDate、agentzid、TN、Ticket、RecordingID、Cycle、[TimeStamp],samplesize t在seqnum中这对问题有效?