1

すべての非集計列でグループ化せずに HAVING 句を使用するSELECT 多くの場合、ID 列と月列を他の多くのメトリックと共に含むテーブルに直面します。他の列に基づいて特定の行を除外します。12 か月分のデータをすべて含む ID のみを取得したいので、次のようにします。

proc sql;
   create table t as
   SELECT *
   FROM  T1
   GROUP BY id
   HAVING COUNT(id) = 12
quit;

私にはうまくいくようですが、この方法には危険があるのではないかと思っていました。id と id の数だけで集約されたサブクエリを結合できることはわかっていますが、この方法は非 SQL ユーザーに説明する方がはるかに簡単です。

一般に、ステートメントに集約関数を使用せHAVINGずに列を 2 つだけ使用して句を使用できますか?GROUP BYSELECT

4

4 に答える 4

2

データベースに依存します。私のもの(赤レンガ)では、提示されたクエリはエラーをスローします。それを機能させるには、変更する必要があります

select * 

select id.  

しかし、あなたは間違った動機を持っているかもしれません。私は通常、正しい答えを得る最も効率的な方法に興味があります。私自身とそれを維持しなければならない他の人に明確にすることも重要ですが、一般の人々に明確にすることは私の優先事項の1つではありません.

于 2013-03-19T18:23:34.307 に答える
1

SASは、確かに、SQLの実装でそれを行うことを許可します(タグは、SASの実装を使用していることを示唆しています)。ログにメモが記録されます。

NOTE: The query requires remerging summary statistics back with the original data

pstSASは、実際にはの回答と同じクエリを実行します。

select t.* from (
  select id
  from T1
  group by id
  having count(id) = x) as g
left join T1 as t
on t.id = g.id

舞台裏。現場でクリーンなログが必要な場合を除いて、これを行わない技術的な理由はありません(その場合はそうしません)。それほど危険ではありませんが、同時に、明示的に結合を書き込んでみませんか?

于 2013-03-20T14:59:34.740 に答える
1

GROUP BY 句が使用される場合、選択された値は、グループに対して選択された列の 1 つまたは集計関数の結果から導出される必要があります。これは、リレーショナル代数モデルでは、どのレコードが選択されるかについての保証がないためです。SQL Server などの一部の SQL ダイアレクトは、そのような構造をエラーで拒否します。

ここで、この条件を保持する責任を負うすべてのレコード(つまり、「グループ化されていない/集計列を選択する」) が必要だとすると、結合を使用できます。結合はこれを処理する簡単な方法であり、RA を示していますが、データベースが異なれば、異なる構造で同じ結果がサポートされる場合もあります。

select t.* from (
  select id
  from T1
  group by id
  having count(id) = x) as g
left join T1 as t
on t.id = g.id

ただし、これは次のものとは異なります (SQL Server では無効です)。

select * -- ONLY the id column value is "well-defined" !!
from T1
group by id
having count(id) = x

この後者の場合、group ごとに選択されるレコードは 1 つだけであるためです。これが、グループを定義するか、そのグループから集計された列を使用することが理にかなっている理由でもあります。


1これは常に強制されているわけではありません (実装によって異なります) または必須 (特定のケースによって異なります) ですが、私は常に予測可能な結果が好きです。

于 2013-03-19T19:19:29.703 に答える
1
select t.* from (
  select id
  from T1
  group by id
  having count(id) = x) as g
left join T1 as t
on t.id = g.id
于 2013-08-20T10:04:14.540 に答える