我正在尝试执行查询以获取值。我有两张桌子。
Table 1
包含以下列(RowID
,PercentValue
,TimeStamp
)。
Table 2
包含以下列(RowID
,Elc
,TotalElc
,LbsPerHour
,TotalLbs
,Shift
,{ {1}})。
Timestamp
包含对我很重要的“Table 1
”列。它每6个月更换一次,有时每月更换一次,但很少。发生这种情况时,会插入带有新值和新时间戳的新记录。
PercentValues
每天输入三次值。这些值通过仪表板插入,并插入以下列(Table 2
,Elc
,TotalElc
,LbsPerHour
和TotalLbs
)Shift
是自动递增,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)
答案 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}’;
否则,如果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}’;