1

一連のセンサーから値を読み取りますが、特定のセンサーの読み取り値が 1 つまたは 2 つ失われることがあるため、すべてのセンサーのレコード数が同じかどうかを確認するクエリを時々実行します。

GROUP BY sensor_id HAVING COUNT(*) != xxx;

そのため、クエリを 1 回実行して xxx の値を視覚的に取得し、再度実行して変化があるかどうかを確認します。

しかし、単一のクエリでこれを自動的に行う賢い方法はありますか?

4

2 に答える 2

2

あなたがすることができます:

HAVING COUNT(*) != (SELECT MAX(count) FROM (
  SELECT COUNT(*) AS count FROM my_table GROUP BY sensor_id
) t)

または、各グループのカウントで再度グループ化します (最初の結果は無視します)。

SELECT count, GROUP_CONCAT(sensor_id) AS sensors
FROM (
  SELECT sensor_id, COUNT(*) AS count FROM my_table GROUP BY sensor_id
) t
GROUP BY count
ORDER BY count DESC
LIMIT    1, 18446744073709551615
于 2012-09-06T10:55:26.763 に答える
1
SELECT sensor_id,COUNT(*) AS count
FROM table
GROUP BY sensor_id
ORDER BY count

sensor_id のリストとそれに含まれるすべてのレコードの数が表示されます。その後、変化があるかどうかを手動で確認できます。

SELECT * FROM (
SELECT sensor_id,COUNT(*) AS count
FROM table
GROUP BY sensor_id
) AS t1
GROUP BY count 

変化するすべてのカウントが表示されますが、group by では、どの sensor_id にどのカウントがあるかに関する情報が失われます。

- -編集 - -

私の答えとeggyalの答えの両方から少し取って、これを作成しました。最も頻繁に発生するカウントについては、idのデフォルトと呼び、目立つ値については、別々の行を与えました。このようにして、多数の結果Multi Rowがある場合にテーブルの読みやすさを維持しますが、すべてのカウントが同じOne Rowである場合は単純な 1 行の列もあります。ただし、作成された文字列に満足している場合は、eggyal の回答を使用してください。少しやり過ぎかもしれませんが、次のようになります。

select 'default' as id,t5.c1 as count from(
select id,count(*) as c1 from your_table group by id having count(*)=
(select t4.count from
(
select max(t3.count2) as max,t3.count as count from 
(
select count(*) as count2,t2.count from
(
  SELECT id,COUNT(*) AS count
  FROM your_table
  GROUP BY id
) as t2 
  GROUP BY count
) as t3
) as t4)) as t5 group by count
union all
select t5.id as id,t5.c1 as count from(
select id,count(*) as c1 from your_table group by id having count(*)<>
(select t4.count from
(
select max(t3.count2) as max,t3.count as count from 
(
select count(*) as count2,t2.count from
(
  SELECT id,COUNT(*) AS count
  FROM your_table
  GROUP BY id
) as t2 
  GROUP BY count
) as t3
) as t4)) as t5
于 2012-09-06T10:51:30.630 に答える