2017-07-18 5 views
-1

オブジェクトがテーブルに書き込んだ分の最後のエントリだけを収集する必要があります。同じ時刻に複数の時刻が存在する場合に最新のタイムスタンプを選択

SELECT 
    A.event_time_local AS Datetime, 'PackagingLine' as TagName, 
    A.state_cd AS VALUE 
FROM 
    util_log A, util_state B 
WHERE 
    ent_id = 12 
    AND event_time_local BETWEEN '2017-07-18 07:00:00' AND '2017-07-18 15:00:00' 
    AND B.state_cd IN (0, 1, 3, 4) 
    AND A.state_cd = b.state_cd 

データは

2017-07-18 08:08:35.000 EM45_PackagingLine 0 
2017-07-18 08:08:49.000 EM45_PackagingLine 1 
2017-07-18 09:31:30.000 EM45_PackagingLine 0 
2017-07-18 09:31:38.000 EM45_PackagingLine 0 
2017-07-18 09:31:50.000 EM45_PackagingLine 1 

を返されたデータは、すべての任意のヘルプは素晴らしいだろう

2017-07-18 08:08:49.000 EM45_PackagingLine 1 
2017-07-18 09:31:50.000 EM45_PackagingLine 1 

を望んでいました。

+0

[悪い習慣をキックする:古いスタイルを使用してJOINを](http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/08/bad-habits-to-kick-using-old ANSI - ** 92 ** SQL標準(** 25年*)の*適切な* ANSI 'JOIN'構文で置き換えられた*スタイルのコンマで区切られたテーブル* *前)とその使用はお勧めしません –

+0

時間内の最後のエントリ、意味ですか? – Greenspark

+0

[各グループの最後のレコードを取得する]の可能な複製(https://stackoverflow.com/questions/1313120/retrieving-the-last-record-in-each-group) –

答えて

0

これは、結果セットにevent_time_localを最初にグループ化し、1時間のバケットでrow_numberを追加し、最も古いものから順に番号を付けます。次に、バケット内の最新のローだけを選択します。

あなたの「バケツ」がどれくらいの大きさになりたいかは完全にはわかりません。サンプルデータでは1時間のようですが、わかりません。それはあなたが望んでいない場合は、適切なサイズの間隔を提供するために、日付のロジックを微調整するだけです。

WITH NumberedResultSet AS 
(
    SELECT 
     A.event_time_local AS Datetime, 'PackagingLine' as TagName, 
     A.state_cd AS VALUE 
     , ROW_NUMBER() OVER (Partition By DATEADD(hour, DATEDIFF(hour, 0, event_time_local), 0) Order By event_time_local desc) as rn 
    FROM 
     util_log A, util_state B 
    WHERE 
     ent_id = 12 
     AND event_time_local BETWEEN '2017-07-18 07:00:00' AND '2017-07-18 15:00:00' 
     AND B.state_cd IN (0, 1, 3, 4) 
     AND A.state_cd = b.state_cd 
) 

SELECT 
    * 
FROM 
    NumberedResultSet 
WHERE 
    rn = 1 
関連する問題