【问题标题】:calculating based on meeting a range condition基于满足范围条件计算
【发布时间】:2011-02-15 22:26:02
【问题描述】:

我有一个数据库(Faster),存储了数千辆汽车和设备的详细信息。我的目标是获取过去两年(自 20090101 以来)累计行驶里程少于 1000 英里的车辆和设备的清单。我正在处理的三个主要表是:

eheader(有装备信息,主键=ehuid) wheader(有工单信息;whehuid 链接到 ehuid, 工单主键是 whuid), wmreading(将抄表信息链接到每个工单; wmwhuid 链接到 whuid)。

棘手的部分是,对于每件设备,我需要计算最近的抄表和大约 2 年前发生的抄表之间的差异。

另一个棘手的部分是近似。我不能保证每辆车在 2009 年 1 月和 2011 年 1 月都会发生抄表。我只能假设在大约 3 个月的范围内该设备上发生了工作订单(甚至可能留下一些车辆)。

我需要一个查询,即每辆车将从 2009 年初的某个范围内的工作订单中读取仪表读数,并从 2010 年底到现在的某个最近范围内的工作订单中减去同一车辆的仪表读数。

关于如何查询这个有什么想法吗?

【问题讨论】:

  • 想用 ERD 中表格的屏幕截图来编辑您的问题吗? (显示关系?)

标签: sql database sql-server-2005 tsql


【解决方案1】:

这应该可以帮助你

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

【讨论】:

    猜你喜欢
    • 2016-03-13
    • 2018-04-25
    • 2019-01-22
    • 2013-03-18
    • 1970-01-01
    • 2015-03-21
    • 2019-04-30
    • 1970-01-01
    • 2020-08-29
    相关资源
    最近更新 更多