1

15分の時間値ごとに最も近い値に対してSQLSELECTを実行したいと思います。例えば:

00:15,
00:30,
00:45,
01:00,
01:15 etc...

すべての値を最も近い15分に切り捨てることができたが、最も近いものだけが必要な場合は、以下を使用してスタンプされた00秒ではないタイムスタンプ(時間)に基づいています。

SELECT dateadd(minute, -1 * datediff(minute, 0, 
    cast(convert(varchar(20),[time],100) as smalldatetime)) % 15, 
    dateadd(minute, datediff(minute, 0, [time]), 0)) as [TIMESTAMP],
    cast(convert(varchar(20),[time],100) as smalldatetime), [time], 
    tagname , value
FROM hdata
INNER JOIN rtdata
    ON hdata.tag_id = rtdata.id
WHERE tagname = 'M1_WH_004'
order by [TIMESTAMP] desc

(注:タグ名はhdataテーブルにないため、タグ名をプルするには内部結合が必要です)

生成:

サンプルデータ

したがって、15分ごとに、15分の境界に最も近い値のみが必要です。上記のデータの場合、09:45と09:30のデータはそれぞれ09:45:15.383と09:30:17.463になります。

サブクエリまたはcaseステートメントが必要ですか?どんな助けでも大歓迎です!

これに加えて、aにはすでにソリューションのデータ(15分ごとのデータ)のように見えるテーブルがあり、サブクエリは次のように最後の2つの値に基づいて計算を実行しました。

SELECT DD1.[TIME_STAMP] AS [TIME_STAMP], DD1.[kWh1] AS [kWh1], DD1.[kWh2] AS [kWh2], (DD1.[kWh1] + DD1.[kWh2]) AS [Total] FROM (SELECT a.ID
      ,a.TIME_STAMP
      ,(a.[1_M1_Wh] - (SELECT TOP 1 b.[1_M1_Wh] FROM TagCapture b WHERE b.TIME_STAMP = DATEADD(MINUTE, -15, a.TIME_STAMP))) * 0.04 AS kWh1
      ,(a.[1_M2_Wh] - (SELECT TOP 1 b.[1_M2_Wh] FROM TagCapture b WHERE b.TIME_STAMP = DATEADD(MINUTE, -15, a.TIME_STAMP))) * 0.04 AS kWh2
  FROM [TagCapture] a) DD1 

このクエリで提供されるソリューションをどのように使用できますか?私はすべてのサブクエリと少し混乱しています。

つまり、tサブクエリによって定義されたデータに基づいて、前の値から15分間のカウント値を減算し、乗算して必要な値を取得します。各FROM句のどこにtサブクエリを挿入しますか?私はそれを機能させることができないようです。上記は、tクエリが「M1」と「M2」の2つの異なるタグ名を定義する場所です。

よろしくお願いします!!

4

1 に答える 1

1

SQL Server を使用しているようです。もしそうなら、あなたはrow_number()これを解決するために使用することができます.

select t.*
from (select t.*, row_number() over (partition by tagname, time15 order by time) as seqnum
      from (SELECT dateadd(minute, -1 * datediff(minute, 0, cast(convert(varchar(20),[time],100) as smalldatetime)) % 15, dateadd(minute, datediff(minute, 0, [time]), 0)) as [TIMESTAMP], cast(convert(varchar(20),[time],100) as smalldatetime) as time15,
                   [time], tagname , value
            FROM hdata INNER JOIN rtdata
                 ON hdata.tag_id = rtdata.id
            WHERE tagname = 'M1_WH_004'
          ) t
    ) t
where seqnum = 1
于 2013-01-03T02:25:22.137 に答える