0

假设我有一张桌子...

校准

  • 日期
  • 校准因子

还有一张桌子……

读数

  • 日期
  • 阅读

读数是定期进行的……校准(不会改变后续读数,但只是弄清楚校准时读数偏离了多少)很少发生。因此,在任何给定时间,读数都需要通过最新的CalibrationFactor 进行校正。我不需要通过SELECT 语句进行此更正;我只希望它们在同一行。

所以,我想要一些 SELECT,它会给我:Readings.Date、Readings.Reading、Calibrations.CalibrationFactor,其中 CalibrationFactor 是最新的,它仍然早于 Readings.Date。我在这里查看了之前的一些问题,但我发现的最接近的问题是只能找到最新的校准周期(SQL 连接:选择一对多关系中的最后一条记录

想法?

4

2 回答 2

1

我认为您链接的问题几乎可以满足您的需求-但是如果您想要另一种方式,可以尝试(mysql版本)

select reading.dated, reading.reading, ( 
  select  factor 
  from calibration 
  where calibration.dated < reading.dated
  order by calibration.dated desc limit 1 
) factor
from reading

看到这个Sql Fiddle

于 2013-04-25T20:27:35.890 回答
0

好的,我想我想出了调整:

SELECT R.Date, R.Reading, C1.CalibrationFactor
FROM Readings R
JOIN Calibrations C1 ON C1.Date < R.Date 
LEFT OUTER JOIN Calibrations C2 ON C2.Date < R.Date AND C1.Date < C2.Date
WHERE C2.Date is NULL

第一个 JOIN在给定读数日期之前的所有日期加入校准。因此,例如(为了便于阅读,我将使用日期名称。假设读数是在星期一、星期二和星期三进行的):

R.Date | C1.Date
Friday | Monday
Friday | Tuesday
Friday | Wednesday

第二个 LEFT OUTER JOIN 再次加入校准,在所有日期(如第一次加入)在读取日期之前,但在 C1 中的日期之后......

R.Date | C1.Date   | C2.Date
Friday | Monday    | Tuesday
Friday | Monday    | Wednesday
Friday | Tuesday   | Wednesday
Friday | Wednesday | NULL

只有在 C2.Date 为空的情况下,当C2 中没有日期在C1.Date之后并且仍然在读取之前,这意味着 C1 将是最近的行......因此, “C2.Date 为空”

于 2013-04-25T20:43:04.080 回答