这是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做这个。
如果不清楚,请告诉我。对不起,我没有任何样本数据。
答案 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