2

時間でスケーリングされた値を持つテーブルがあり、値をスケーリングできる必要があります。私はこれをできるだけシンプルにしようとしていますが、実行速度は私にとって大きなプレーヤーです。

tblTSS_DataCollectionの例を示します。

SELECT TOP 5
   [DataPointID]
  ,[DatapointDate]
  ,dc.[DataPointValue] 
FROM [tblTSS_DataCollection] dc
Where DatapointID = 1093

ここでは、非常に単純なテーブルが返されます。

DataPointID DatapointDate            DataPointValue
1093        2012-07-29 00:00:01.000  0.01869818
1093        2012-07-29 00:01:01.000  0.01882841
1093        2012-07-29 00:02:01.000  0.01895865
1093        2012-07-29 00:03:01.000  0.01908888
1093        2012-07-29 00:04:01.000  0.01921912

これで、次のようなtblTSS_ScaleSettingsという別のテーブルができました。

SELECT [ID]
      ,[DatapointID]
      ,[EffectiveDate]
      ,[ScaleType]
      ,[ScaleValue]
FROM [tblTSS_ScaleSettings]

これは次のような結果を返します:

ID  DatapointID EffectiveDate            ScaleType   ScaleValue
1   1093        2012-07-29 00:03:01.000  *           10.0000

今、私ができるようにする必要があるのは、次のようなものです。

SELECT TOP 5 
       dc.[DataPointID]
      ,[DatapointDate]
      ,dc.[DataPointValue] AS [DVOld]
      ,CASE sc.ScaleType
            WHEN '*' THEN dc.[DataPointValue] * sc.ScaleValue
            WHEN '/' THEN dc.[DataPointValue] / sc.ScaleValue
            WHEN '+' THEN dc.[DataPointValue] + sc.ScaleValue
            WHEN '-' THEN dc.[DataPointValue] - sc.ScaleValue
            ELSE dc.[DataPointValue]
        END
        AS [DatapointValue]
 FROM [tblTSS_DataCollection] dc
 JOIN [tblTSS_ScaleSettings] sc
 on sc.DatapointID = dc.DatapointID
 Where dc.DatapointID = 1093

どちらが返されますか:

DataPointID DatapointDate            DVOld        DatapointValue
1093        2012-07-29 00:00:01.000  0.01869818   0.1869818
1093        2012-07-29 00:01:01.000  0.01882841   0.1882841
1093        2012-07-29 00:02:01.000  0.01895865   0.1895865
1093        2012-07-29 00:03:01.000  0.01908888   0.1908888
1093        2012-07-29 00:04:01.000  0.01921912   0.1921912

ただし、これの問題は、テーブルのスケーリングEffectiveDateが00:03:01まで開始されないため、すべてのレコードでスケーリングが開始されないためです。スケーリングは、次の発効日までそのスケールにする必要があります。場合によっては、複数のスケールが発生し、1年を通してさまざまな時期に変化することがあります。だから私はそれを計画するためにSelectQueryが必要です....これはそれがトリッキーになるところです。

これは次のようになります。

DataPointID DatapointDate            DVOld        DatapointValue
1093        2012-07-29 00:00:01.000  0.01869818   0.01869818
1093        2012-07-29 00:01:01.000  0.01882841   0.01882841
1093        2012-07-29 00:02:01.000  0.01895865   0.01895865
1093        2012-07-29 00:03:01.000  0.01908888   0.1908888
1093        2012-07-29 00:04:01.000  0.01921912   0.1921912

誰か助けてもらえますか?

4

2 に答える 2

1

このようなものがあなたのために働くかもしれません:

SELECT TOP 5 
       dc.DataPointID
      ,DatapointDate
      ,dc.DataPointValue AS DVOld
      ,CASE sc.ScaleType
            WHEN '*' THEN dc.DataPointValue * sc.ScaleValue
            WHEN '/' THEN dc.DataPointValue / sc.ScaleValue
            WHEN '+' THEN dc.DataPointValue + sc.ScaleValue
            WHEN '-' THEN dc.DataPointValue - sc.ScaleValue
            ELSE dc.DataPointValue
        END
        AS DatapointValue
 FROM tblTSS_DataCollection dc
 LEFT JOIN tblTSS_ScaleSettings sc
 ON sc.DatapointID = dc.DatapointID
 AND sc.EffectiveDate = (
    SELECT MAX(EffectiveDate)
    FROM tblTSS_ScaleSettings
    WHERE DatapointID = dc.DatapointID
        AND EffectiveDate <= dc.DatapointDate
 )
 WHERE dc.DatapointID = 1093
于 2012-12-10T21:05:13.647 に答える
0

このようなfrom条項は機能しますか?

 FROM [tblTSS_DataCollection] dc
 JOIN sc  on sc.DatapointID = dc.DatapointID inner join
(
    select datapointid, max(effectivedate) as max_dt
    from
        [tblTSS_ScaleSettings] 
    where
        effectiveDate <= getdate()
    group by datapointID
) mx on
sc.datapointid = mx.datapointid and
sc.effectivedate = mx.max_dt

入力した内容は次のようになります。

SELECT TOP 10
       dc.[DataPointID]
      ,[DatapointDate]
      ,dc.[DataPointValue] AS [DVOld]
      ,EffectiveDate
    ,ScaleType
    ,ScaleValue
    ,CASE ScaleType 
            WHEN '*' THEN dc.[DataPointValue] * ScaleValue 
            WHEN '/' THEN dc.[DataPointValue] / ScaleValue 
            WHEN '+' THEN dc.[DataPointValue] + ScaleValue 
            WHEN '-' THEN dc.[DataPointValue] - ScaleValue 
            ELSE dc.[DataPointValue]
        END
        AS [DatapointValue]

  FROM [tblTSS_DataCollection] dc inner join
(select DatapointID, max(EffectiveDate) as max_effective,
from tblTSS_ScaleSettings ts
    where ts.EffectiveDate <= dc.DatapointDate
group by DatapointID) mx
on dc.datapointid = mx.datapointid and
EffectiveDate = max_effective 
  Where dc.DatapointID = 1093
于 2012-12-10T20:46:36.560 に答える