расчет на основе соответствия условиям диапазона - PullRequest
0 голосов
/ 16 февраля 2011

У меня есть база данных (Faster), в которой хранится подробная информация о тысячах транспортных средств и оборудования. Моя цель - получить список транспортных средств и оборудования, на которых за последние два года было начислено менее 1000 миль (с 20090101 года). Вот три основные таблицы, с которыми я имею дело:

eheader (has equip info, primary key=ehuid)

wheader (has work order info; whehuid links to ehuid, 
         work order primary key is whuid), 

wmreading (has the meter reading info linked to each workorder; 
           wmwhuid links to whuid).  

Сложность заключается в том, что для каждого элемента оборудования мне нужно учитывать разницу между недавними показаниями счетчика и показаниями счетчика, которые имели место примерно 2 года назад.

Другая сложная часть - это приблизительно . Я не могу гарантировать, что показания счетчика имели место для каждого транспортного средства, скажем, в январе 2009 года, а также в январе 2011 года. Я могу только предположить, что на этом оборудовании выполнялся рабочий заказ в течение примерно 3 месяцев (и даже это, вероятно, оставьте несколько автомобилей вне дома).

Мне нужен запрос, который для каждого транспортного средства будет брать показания счетчика из рабочего задания в некотором диапазоне в начале 2009 года и вычитать показания счетчика для этого же транспортного средства из рабочего задания в некотором недавнем диапазоне от конца 2010 года до настоящего времени.

Есть мысли о том, как это сделать?

1 Ответ

1 голос
/ 16 февраля 2011

Это должно помочь вам

select
    *,
    DATEDIFF(D, readingdate, secondreadingdate) as DaysBetweenReadings,
    secondmeter-meter as DistanceTravelled
from
(
select
    e.*,
    r1.readingdate,
    r2.readingdate secondreadingdate,
    r1.meter,
    r2.meter as secondmeter,
    rn= ROW_NUMBER() over (
    partition by e.ehuid
    order by -- prefer the one closer to date
             datediff(d, p.dt, r1.readingdate)
           , -- from the first reading, prefer the r2 record that is closest to exactly 2 years after
             abs(datediff(d, dateadd(year,2,r1.readingdate), r2.readingdate)))
from eheader e
inner join wheader w on w.whehuid = e.ehuid
inner join wmreading r1 on r1.wmwhuid = w.whuid
inner join wmreading r2 on r2.wmwhuid = w.whuid
cross join (select dt=convert(datetime,'20090101')) p -- pivotdate
where -- about 3 months from date
      r1.readingdate between p.dt and DATEADD(MONTH, 3, p.dt) 
  and -- 3 months to or from 2 years after date
      r2.readingdate between DATEADD(month, 21, p.dt) and DATEADD(month, 27, p.dt) 
) SubQuery
where rn=1
  and secondmeter-meter < 1000 -- less than 1000 accrued
order by ehuid
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...