SQL Server - 如何为每x个工作者选择x个任务数

时间:2016-03-17 18:08:30

标签: sql sql-server

我需要一些帮助在SQL Server 2012中编写查询,以便为每个选定数量的工作人员选择特定数量的任务。如果我这样做是传统的编程语言,我会使用像foreach这样的东西。但是,我无法找到一种很好的方法来将foreach函数实现到sql中。我确信有一种更简单的方法可以做到这一点。

例如,假设我有3个表:

MonthlyReview

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。

非常感谢任何帮助。

1 个答案:

答案 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()函数本身。

祝你好运!