我需要一些帮助在SQL Server 2012中编写查询,以便为每个选定数量的工作人员选择特定数量的任务。如果我这样做是传统的编程语言,我会使用像foreach这样的东西。但是,我无法找到一种很好的方法来将foreach函数实现到sql中。我确信有一种更简单的方法可以做到这一点。
例如,假设我有3个表:
DateReviewed, WorkerID
WorkerID, WorkerName
的TaskID, WorkerID
首先,我选择我想要选择的工作人员(他们在其他一些数据上进行过滤,例如名称或组织(未图示)),所以我认为这样可以更容易将其放入临时表中
CREATE TABLE #WorkersToAudit (
WorkerID varchar(45),
DateReviewed datetime)
INSERT INTO #WorkersToAudit(WorkerID, DateReviewed)
SELECT TOP (4) Workers.WorkerID, MIN(MonthlyReview.DateReviewed) AS DateReviewed FROM Workers
LEFT JOIN MonthlyReview ON Workers.WorkerID = MonthlyReview.WorkerID
WHERE Workers.WorkerName LIKE '%Browne%'
GROUP BY Worker.WorkerID
DROP TABLE #WorkersToAudit
我以为我可以抓住结果中的(4)WokerID并找到(4)每个的TaskID,但我还没有找到一个很好的方法来做到这一点尽管很多搜索。搜索到的WorkerID的数量和每个返回的TraderID的数量可以是1-10。
非常感谢任何帮助。
答案 0 :(得分:3)
在一个查询中执行此操作的最简单方法是使用WINDOWING函数。在这种情况下,ROW_NUMBER()
将起作用:
select WorkerID, TaskID
FROM (
SELECT Workers.WorkerID, Tasks.TaskID,
row_number() over (partition by Workers.WorkerID order by Tasks.TaskID) AS rn
FROM Workers
LEFT JOIN Tasks ON Workers.WorkerID = Tasks.WorkerID
WHERE Workers.WorkerName LIKE '%Browne%'
) where rn <= 4
注意over
函数的row_number()
子句的关键部分 - partition by
实际上“按”WorkerID对行进行计数,order by
指定,好吧,计算行的顺序。
您可以更改row_number的分组和排序方式,并且可以在select
子句中包含所需的任何列,但关键部分确实是使用row_number()
函数本身。