3

私はこのようなものを持っています:

 SELECt *
   FROM (
        SELECT prodid, date, time, tmp, rowid
          FROM live_pilot_plant
         WHERE date BETWEEN CONVERT(DATETIME, '3/19/2012', 101)
           AND CONVERT(DATETIME, '3/31/2012', 101)
         ) b
  WHERE b.rowid % 400 = 0

参考までに: where 句での変換の理由は、日付が varchar(10) として格納されているためです。正しい範囲のデータを取得するには、datetime に変換する必要がありました。(いろいろ試した結果、これでうまくいきました)

選択した日付中に 4 時間ごとに必要なデータを返す方法を考えています。約 5 秒ごとにデータを収集しています (データにいくつかの中断があります)。つまり、データは 2 時間収集されませんでしたが、その後は 5 秒ごとに収集されます。

私の例では、ROWIDでモジュロを使用しました-構文は機能しますが、上記のように、データが収集されない期間がいくつかあるため、次のようなロジックを使用します:データを5秒ごとに取得し、それを4時間倍すると、間にある行の数をおおよそ言うことはできません。

私の時間列はvarchar列で、hh:mm:ssの形式です

私の理想的な出力は次のとおりです。

  | prodid  | date       | time      |  tmp  |
  |    4    | 3/19/2012  | 10:00:00  |  2.3  |
  |    7    | 3/19/2012  | 14:00:24  |  3.2  |

ご覧のとおり、(秒単位で) 少しずれている可能性があります。時間に関しては、おおよその値が必要です。

前もって感謝します。

4

3 に答える 3

1

これはうまくいくはずです

select prodid, date, time, tmp, rowid
from live_pilot_plant as lpp
inner join (

select min(prodid) as prodid                     -- is prodid your PK?? if not change it to rowid or whatelse is your PK
    from live_pilot_plant
    WHERE date BETWEEN CONVERT(DATETIME, '3/19/2012', 101)  -- or whatever you want
                   AND CONVERT(DATETIME, '3/31/2012', 101)  -- for better performance it is on the inner select
    group by date, 
    floor(                                       -- floor makes the trick
    convert(float,convert(datetime, time))       -- assumes "time" column is a varchar containing data like '19:23:05'
    * 6                                          -- 6 comes form 24 hours / 4 hours
    )

) as filter on lpp.prodid = filter.prodid        -- if prodid is not the PK also correct here.

「when_it_was」という名前を付けて、1 つの日時フィールドにのみ日付 + 時刻データを持っている他のすべての人への補足的な注意:

group by floor(when_it_was * 6)                  -- again, 6 comes from 24/4
于 2012-07-31T21:05:03.137 に答える
1

次の行に沿った何かが機能するはずです。基本的に、日付と時刻のパーティションを作成します。各パーティションは 4 時間のブロックを表し、各パーティションから最高ランクのレコードを選択します

select * from (
select *,
row_number() over (partition by date,cast(left( time, charindex( ':', time) - 1) as int)  / 4 order by
date, time) as ranker  from live_pilot_plant
) Z where ranker = 1
于 2012-07-31T20:05:09.673 に答える
0

rowid が PK であり、日付/時刻とともに増加すると仮定します。時間フィールドを 4 時間間隔の数値に変換substring(time,1,2))/4し、1 日の 4 時間グループのそれぞれから MIN(rowid) を選択するだけです。

select prodid, date, time, tmp, rowid from live_pilot_plant where rowid in
(
select min(rowid) 
from live_pilot_plant 
WHERE CONVERT(DATETIME, date, 101) BETWEEN CONVERT(DATETIME, '3/19/2012', 101)
           AND CONVERT(DATETIME, '3/31/2012', 101)
group by date,convert(int,substring(time,1,2))/4

)
order by CONVERT(DATETIME, date, 101),time
于 2012-08-01T11:17:57.600 に答える