2014-07-10 92 views
0

我正在嘗試執行查詢以獲取值。我有兩張桌子。在同一查詢中選擇最近日期和確切日期

Table 1具有以下列(RowID,PercentValue,TimeStamp)。

Table 2具有以下的列(RowIDElcTotalElcLbsPerHourTotalLbsShiftTimestamp)。

Table 1有'PercentValues'這一欄對我很重要。它每六個月更換一次,有時一個月一次,但很少。當發生這種情況時,插入具有新值和新時間戳的新記錄。

Table 2具有每天輸入三次的值。這些值是通過儀表板插入下面的列得到插入(ElcTotalElcLbsPerHourTotalLbsShift)的RowID是自動遞增和GETDATE()用於ShiftTimeStamp)

我需要從查詢值表2基於日期並將它們插入到新表中3.因此,如果我在一個月前查詢,則很容易對錶2執行此操作,因爲我可以將它與確切的日期進行匹配,因爲我每天都有記錄。在表2中,我有幾條記錄。

我需要從table 1PercentValue乘以TotalElc爲了給我一個PercentElc。但是我需要PercentValue在我在儀表板中選擇的最近日期之間。如果table 1PercentVaule的0.20和timestamp的7/7/2014以及另一個PercentValue的.30的timestamp的7/20/14,並且如果我查詢詢問table 2在2014年7月10日的值;我應該期望從table 1中檢索出PercentValue

如果在7/10/2014之前有多個條目,那麼PercentValue應該是距離查詢日期最近的一個。這是我的代碼。我不確定如何正確編碼。任何幫助最受讚賞。謝謝 。

select b.ELC, b.TotalElc * a.PercentValue as PercentElc, 
b.LbsPerCase, b.TotalLbs,Shift, b.ShiftTimeStamp 
from Table1 a, Table2 b, 
where b.ShiftTimeStamp= ‘{0}’ and b.Shift = ‘{1}’ 

「{0}」我從儀表板以選擇傳遞參數基於所述值截止日期和「{1}」是移位(基於1,2,3)

+0

所以 「最近」 是嚴格之前?當你詢問'table1'的那天有'table2'的更新_during_條目時會發生什麼?你當天有2個不同的值,或者只有一個(是根據你的查詢日期還是存儲的時間戳)?我們可以得到樣本起始數據和期望的結果嗎? –

回答

1

您可以使用CTE的查找對應的最近的時間戳,如下PERCENTVALUE:

編輯

如果最近Table1.Timestamp條目必須是之前Table2.Timestamp,那麼查詢BECO MES更簡單,如下:

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

否則,如果從表1最近的時間戳可能更早或更晚於時間戳表2中,那麼可以使用下面的查詢。

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