SQL-根据两列中的值选择top 1

SQL-根据两列中的值选择top 1,sql,sql-server-2008,select,group-by,partitioning,Sql,Sql Server 2008,Select,Group By,Partitioning,我知道这个标题说的不多,但让我向你解释一下我的情况: 我有下表: 现在,我想从每个部门中选择前1名,但我不想获得重复的职位id,因此我希望每个部门的前1名员工按项目数量排列,但要有不同的职位id。结果是突出显示的行。您不能保证返回的位置是最佳的。在两个部门中,一个职位可能是最好的,在这种情况下,需要放宽其中一个结果限制 因此,这里有一种方法可以获得一些(也许是所有)级别最高但职位不同的部门。首先,只为每个部门选择排名最高的员工。这些项目最多 然后,为每个PositionTypeId从这些备选方

我知道这个标题说的不多,但让我向你解释一下我的情况:

我有下表:


现在,我想从每个部门中选择前1名,但我不想获得重复的职位id,因此我希望每个部门的前1名员工按项目数量排列,但要有不同的职位id。结果是突出显示的行。

您不能保证返回的位置是最佳的。在两个部门中,一个职位可能是最好的,在这种情况下,需要放宽其中一个结果限制

因此,这里有一种方法可以获得一些(也许是所有)级别最高但职位不同的部门。首先,只为每个部门选择排名最高的员工。这些项目最多

然后,为每个
PositionTypeId
从这些备选方案中随机选择一个部门。然后,为每个部门随机选择一个职位类型。以下查询采用这种方法:

select DepID, EmplyeeID, PositionTypeId, NumProjects
from (select t.*, row_number() over (partition by DepId order by newid()) as seqnum
      from (select t.*, row_number() over (partition by PositionTypeId order by newid()) as position_seqnum
            from (select t.*,
                         dense_rank() over (partition by DepId order by NumProducts desc
                                           ) as rank_seqnum
                  from t
                 ) t
            where rank_seqnum = 1
           ) t
      where position_seqnum = 1
     ) t
where seqnum = 1;

这并不保证为每个部门返回一行。但是,可以保证返回的所有部门都有不同的职位类型,并且这些行最适合该部门。您可能需要调整中间步骤,以确保更大的部门覆盖率。但是,由于问题不一定会有解决办法,这样的调整可能会付出比实际更多的努力。

你不能保证返回的位置是最好的。在两个部门中,一个职位可能是最好的,在这种情况下,需要放宽其中一个结果限制

因此,这里有一种方法可以获得一些(也许是所有)级别最高但职位不同的部门。首先,只为每个部门选择排名最高的员工。这些项目最多

然后,为每个
PositionTypeId
从这些备选方案中随机选择一个部门。然后,为每个部门随机选择一个职位类型。以下查询采用这种方法:

select DepID, EmplyeeID, PositionTypeId, NumProjects
from (select t.*, row_number() over (partition by DepId order by newid()) as seqnum
      from (select t.*, row_number() over (partition by PositionTypeId order by newid()) as position_seqnum
            from (select t.*,
                         dense_rank() over (partition by DepId order by NumProducts desc
                                           ) as rank_seqnum
                  from t
                 ) t
            where rank_seqnum = 1
           ) t
      where position_seqnum = 1
     ) t
where seqnum = 1;

这并不保证为每个部门返回一行。但是,可以保证返回的所有部门都有不同的职位类型,并且这些行最适合该部门。您可能需要调整中间步骤,以确保更大的部门覆盖率。但是,由于问题不一定会有解决方案,这样的调整可能需要付出比实际更多的努力。

是否可能第二个突出显示的行是错误的?它不应该是包含EmployeeID 580824 DepID 484646(它有52个项目)的那个吗?也许我误解了这个问题,你说得对。我很抱歉。在这种情况下,将选择EmplyEID 580824。我错过了。有没有可能第二行高亮显示的是错误的?它不应该是包含EmployeeID 580824 DepID 484646(它有52个项目)的那个吗?也许我误解了这个问题,你说得对。我很抱歉。在这种情况下,将选择EmplyEID 580824。我错过了。这不完全是我需要的,但它确实起作用了。谢谢这不完全是我需要的,但它能胜任。谢谢