从SQL Server 2000中每个员工的第一行和最后一行中减去值

时间:2011-09-08 22:48:13

标签: sql sql-server-2000

这是SQL Server 2000,因此我没有任何窗口函数(row_number)。

我有一张表emp_data

emp_id     datime                 miles    gallons
23148      2011-08-21 02:00        32       3
23148      2011-08-21 09:00        38       4
23148      2011-08-21 11:00        40       5
42938      2011-08-20 03:00        23       1
42938      2011-08-22 08:00        53       13
  • 每一行都是前一行累积(运行?)。

我需要获得员工驾驶的里程数,我通过减去最早日期的里程减去最近日期的里程数来实现。 (40-32 = empid=23148驱动8英里)。我也需要为加仑做这件事。

我需要为每个司机计算每加仑英里数。

最终结果应为:

  emp_id    miles   gallons
   23148      8       2
   42938      30      12

为多个驱动程序执行此操作是我遇到的问题。在SQL Server 2005中,我可能会执行row_number partition_by,但不知道在SQL Server 2000中要做什么。我已经为一个驱动程序做了类似的事情。不会被驱动程序分区工作。不得不使用identity()代替row_number。

SELECT IDENTITY(int) as id, emp_id, datime, miles, gallons
into #t1
FROM emp_data
where 
   emp_id='18018'
   and datime >= '20110820 02:00'
   and datime <= '20110827 02:00'
ORDER BY datime

select foo1.emp_id,foo2.miles - foo1.miles as miles_driven,
    foo2.gallons - foo2.gallons as gallons_used
from (
    SELECT * 
    FROM #t1
    where id = 1) foo1
CROSS JOIN  (
    SELECT *
    from #t1 
    where id = (select max(id) from #t1 t)
    ) foo2

我确实有一个来自SQL Server 2008的SQL Server 2000数据库的链接服务器,所以我正在考虑获取数据然后在那里进行处理,但是只有一周就有大约100万条记录。我可能需要为YTD做这个。

如果不清楚,请告诉我。对不起,我没有任何样本数据。

2 个答案:

答案 0 :(得分:2)

这应该这样做。

SELECT 
   emp_id,
   MAX(miles) - MIN(miles) AS miles_driven,
   MAX(gallons) - MIN(gallons) AS gallons_used
FROM emp_data 
GROUP BY emp_id

希望这有帮助。

答案 1 :(得分:2)

我认为这正是您正在寻找的(不需要临时表),但只有在您有其他我们没有看到的数据限制时才使用。否则请使用smdrager回答

SELECT minmaxdate.emp_id, 
       LAST.miles - FIRST.miles, 
       LAST.gallons - FIRST.gallons 
FROM   (SELECT emp_id, 
               MIN(datime) firstdate, 
               MAX(datime) lastdate 
        FROM   emp_data 
        GROUP  BY emp_id) minmaxdate 
       INNER JOIN emp_data FIRST 
         ON FIRST.emp_id = minmaxdate.emp_id 
            AND FIRST.datime = minmaxdate.firstdate 
       INNER JOIN emp_data LAST 
         ON FIRST.emp_id = minmaxdate.emp_id 
            AND LAST.datime = minmaxdate.lastdate