SQL查询逻辑用于计算重新分配的记录

时间:2013-08-20 14:12:59

标签: sql

我有下表,其中将机械分配给车辆。我试图找出如何将所有分配相加并减去每个机制的所有重新分配。

结果应该是机械师N0055345应该有2个任务,机械师N0057581应该有0(由于重新分配)。

Auto ID EntryDate       Mechanic ID      Vehicle Type
1022013 8/17/2013       N0055345          CAR
1022011 8/15/2013       N0057581          CAR
1022011 8/19/2013       N0055345          CAR

谢谢, 布拉德

3 个答案:

答案 0 :(得分:0)

所以我在这里采用的理论是,我只想按照auto_id的“最新”记录计算机制。

SELECT mechanic
     , Count(*)
FROM   (
        SELECT mechanic
             , Row_Number() OVER (PARTITION BY auto_id ORDER BY entry_date DESC) As row_num
        FROM   your_table 
       ) As x
WHERE  row_num = 1
GROUP
    BY mechanic

答案 1 :(得分:0)

您正在寻找的是力学的当前分配。因此,您需要为每个自动选择最新记录。如果您的数据库支持窗口函数,您可以在sum()语句中找到最大值并进行比较:

SELECT mechanic, sum(case when entrydate = maxdate then 1 else 0 end)
FROM (SELECT mechanic, max(entrydate) OVER (PARTITION BY autoid) as maxdate
      FROM t
     ) t
GROUP BY mechanic;

重要的是不要过滤数据,否则你将失去拥有0辆车的机制。

答案 2 :(得分:0)

  

结果应该是机械师N0055345应该有2个任务   和机械师N0057581应该有0(由于重新分配)。

您的数据中没有迹象表明如何达到此目的。如果这是您想要的数据集,那么您不是在寻找机械师的最新任务,而是需要所有当前任务的总和。如上所述,您的数据中没有任何内容显示重新分配的内容。

如果当前没有这样做的方法,并且您在重新分配时没有删除分配中的记录,我建议在表中添加“CurrentlyAssigned”标志,然后您可以对其进行过滤。当他们被重新分配时,切换标志。

表格数据(作业)

AutoID  EntryDate   MechanicID  VehicleType  CurrentlyAssigned
1022011 8/19/2013   N0055345    CAR          1
1022011 8/18/2013   N0057581    CAR          0
1022014 8/15/2013   N0055345    CAR          1

查询

SELECT MechanicID, COUNT(*) as [NumberOfAssignments]
FROM Assignments
WHERE CurrentlyAssigned = 1
GROUP BY MechanicID

输出

MechanicId    NumberOfAssignments
N0055345      2

如果你想包括没有作业的那些,使用0/1标志的好处意味着你可以加总。

查询

SELECT MechanicID, SUM(CONVERT(INT,CurrentlyAssigned)) as [NumberOfAssignments]
FROM Assignments
GROUP BY MechanicID

输出

MechanicId    NumberOfAssignments
N0055345      2
N0057581      0