在同一查询中选择最近日期和确切日期

时间:2014-07-10 21:48:47

标签: sql sql-server sql-server-2008

我正在尝试执行查询以获取值。我有两张桌子。

Table 1包含以下列(RowIDPercentValueTimeStamp)。

Table 2包含以下列(RowIDElcTotalElcLbsPerHourTotalLbsShift,{ {1}})。

Timestamp包含对我很重要的“Table 1”列。它每6个月更换一次,有时每月更换一次,但很少。发生这种情况时,会插入带有新值和新时间戳的新记录。

PercentValues每天输入三次值。这些值通过仪表板插入,并插入以下列(Table 2ElcTotalElcLbsPerHourTotalLbsShift是自动递增,GetDate()用于ShiftTimeStamp)

我需要根据日期查询表2中的值并将它们插入到新表中3.因此,如果我在一个月前查询,则很容易对表2执行此操作,因为我可以将其与确切的日期匹配,因为我每天都有记录。在表2中,我的记录很少。

我需要RowID的{​​{1}}乘以PercentValue才能给我一个table 1。但我需要TotalElc介于我在仪表板中选择的最近日期之间。如果PercentElc的{​​{1}}为.20且PercentValue为7/7/2014,另一个table 1为.30且PercentVaule为7/20 / 14如果我在2014年7月10日询问timestamp中的值?我应该从PercentValue检索。timestamp。{2}。

如果在2014年7月10日之前有多个条目;然后table 2应该是我查询日期最近的那个。这是我的代码。我不确定如何正确编码。任何帮助都非常感谢。谢谢 。

PercentValue

'{0}'是我从仪表板传递的参数,用于选择基于日期的值,'{1}'是班次(基于1,2,3)

1 个答案:

答案 0 :(得分:1)

您可以使用CTE查找与最近的时间戳对应的PercentValue,如下所示:

修改

如果最近的Table1.Timestamp条目必须在Table2.Timestamp之前,则查询会变得更加简单,如下所示:

with time_diff as
(
  select t2.Timestamp t2_ts, max(t1.Timestamp) diff_ts
  from Table1 t1 
  inner join Table2 t2 on t1.Timestamp < t2.Timestamp
  group by t2.Timestamp
)
select 
  a.ELC, 
  a.TotalElc * b.PercentValue as PercentElc, 
  a.LbsPerHour, 
  a.TotalLbs,
  a.Shift , 
  a.TimeStamp 
from Table2 a
INNER JOIN time_diff td ON a.Timestamp = td.t2_ts
INNER JOIN Table1 b ON b.Timestamp = td.diff_ts
--ORDER BY a.RowID
WHERE a.TimeStamp= ‘{0}’ and a.Shift = ‘{1}’;

SQL Fiddle

否则,如果Table1中最近的Timestamp可能早于或晚于Table2中的Timestamp,则可以使用以下查询。

with time_diff as
(
  select t2.Timestamp t2_ts, t1.PercentValue t1_PercentValue, abs(DATEDIFF(ss, t1.Timestamp, t2.Timestamp)) diff_ts
  from Table1 t1 cross join Table2 t2
),
percentvalues as
(
  select
    td1.t2_ts,
    td1.t1_PercentValue
  from
  time_diff td1
  inner join
  (
    select t2_ts, min(diff_ts) min_diff_ts
    from time_diff
    GROUP BY t2_ts
  ) td2
  ON td1.t2_ts = td2.t2_ts and td1.diff_ts = td2.min_diff_ts
)
select 
  a.ELC, 
  a.TotalElc * pv.t1_PercentValue as PercentElc, 
  a.LbsPerHour, 
  a.TotalLbs,
  a.Shift , 
  a.TimeStamp 
from Table2 a
INNER JOIN percentvalues pv ON a.Timestamp = pv.t2_ts
--ORDER BY a.RowID
WHERE a.TimeStamp= ‘{0}’ and a.Shift = ‘{1}’;

SQL Fiddle demo