Вычтите значения из первой и последней строки на сотрудника в SQL Server 2000 - PullRequest
1 голос
/ 09 сентября 2011

Это 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.

Дайте мне знать, если что-то неясно. Извините, у меня нет образцов данных.

Ответы [ 2 ]

2 голосов
/ 09 сентября 2011

Я думаю, это то, что вы ищете (нет необходимости во временных таблицах), но используйте его, только если у вас есть дополнительные ограничения данных, которые мы не видим. В противном случае идите с ответом 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 
2 голосов
/ 09 сентября 2011

Это должно сделать это.

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

Надеюсь, это поможет.

...