0

私のテーブル(例)

id - console - zone - timestamp - temp 
1  - 1       - 1    - 12:00     - 123
2  - 1       - 1    - 12:01     - 234
3  - 1       - 1    - 12:02     - 236
4  - 2       - 1    - 12:01     - 567
5  - 2       - 1    - 12:02     - 657
6  - 1       - 2    - 12:00     - 864
7  - 1       - 2    - 12:02     - 436

私のテーブルは、さまざまな機器からの新しいデータで30〜45秒ごとに更新されます。私の目標は、各コンソール+ゾーンのテーブルをクエリして、最新の一時エントリを取得することです(このテーブルは自動インクリメントされるため、idから実行できます)

理想的な出力は(例)

 id - console - zone - timestamp - temp
 3  - 1       -  1   -  12:02    - 236
 5  - 2       -  1   -  12:02    - 657
 7  - 1       -  2   -  12:02    - 436

クエリで使用しようとしmax()ましたが、期待どおりに機能していません。IDの最大値を取得していますが、その行の温度は取得していません

select max(id), console, zone, timestamp, temp from TABLE group by console, zone order by console, zone;

上記のクエリは正しい数のエントリを返しますが、前述したように、tempは正しくありません。私は常にコンソールとゾーンのテーブルに入力された最初の臨時雇用者を取得します。私はかなり見てきましたが、どの質問をするべきかわからないか、答えが非常に単純で、神々の娯楽のために私を逃れています。

4

2 に答える 2

1

これは、グループ単位の最大値と呼ばれるものの取得と呼ばれ、非常に一般的な質問です。直感的に、と組み合わせて使用MAX()​​するとSELECTGROUP BY対応する正しい行が得られると思うためですが、そうではありません。

代わりに、最大値の選択をサブクエリでラップし、サブクエリの最大値が最大値を取得するフィールドと等しいという条件で自己結合を実行して、正しい行を取得する必要があります。

テーブル構造により、ソリューションはかなり単純になります。これは、最大値が基本的に一意の自動インクリメントIDであるためです。

これを試して:

SELECT
    b.*
FROM
    (
        SELECT MAX(id) AS maxid
        FROM tbl
        GROUP BY console, zone
    ) a
INNER JOIN
    tbl b ON a.maxid = b.id
于 2012-06-22T19:02:30.307 に答える
0
select m.mid, m.console, m.zone, timestamp, temp 
from TABLE t
, (select max(id) mid,console,zone from table group by console,zone ) m
where t.id = m.mid
and t.zone = m.zone
and t.console = m.console
group by m.console, m.zone 
order by 2,3;
于 2012-06-22T18:42:45.590 に答える