Это 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 = 8 миль за empid=23148
). Мне нужно сделать это и для галлонов.
Мне нужно рассчитать мили на галлон для каждого водителя.
Конечный результат должен быть таким:
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 2000 db из SQL Server 2008, так что я думаю о том, чтобы получить данные и затем обработать их, но за одну неделю есть около 1 миллиона записей. Я мог бы сделать это для YTD.
Дайте мне знать, если что-то неясно. Извините, у меня нет образцов данных.