この記事では、SQL CountDistinct演算子を削除する方法について説明します。結果セット内の重複する行。
開発者は、複数の条件を持つSQLテーブルからデータを取得する必要があります。テーブル内のすべての行を取得したいが、使用可能なNULL値を削除したい場合があります。昨年注文した個別の顧客レコードを取得したいとします。
先に進んで、SQLカウント関数の概要を簡単に説明しましょう。
SQLカウント関数
SQLカウント集計関数を使用して、次の行数を取得します。出力。会社が販売したすべての製品のレコードを保持する製品テーブルがあるとします。前四半期に販売された製品の数を知りたい。 SQL Count関数を使用して、指定した条件の行数を返すことができます。
SQL COUNT関数の構文:
COUNT(式);
デフォルトでは、 SQLServerカウント関数はAllキーワードを使用します。これは、SQLServerがテーブル内のすべてのレコードをカウントすることを意味します。重複する値を持つ行も含まれます。
サンプルテーブルを作成し、そこにいくつかのレコードを挿入しましょう。
このテーブルには、重複する値とNULL値もあります。 。
次のスクリーンショットでは、次のことに注意してください。
- カウント(* )重複値とNULL値が含まれます
- カウント(Col1)には重複値が含まれますが、NULL値は含まれません
テーブルで使用可能な個別の値を知りたいとします。 SQL COUNTDISTINCTを使用してこれを行うことができます。
1
2
|
## TestTable
|
次の出力では、2行しか取得されていません。 SQL COUNT Distinctは、結果セットから重複値とNULL値を削除しません。
別の例を見てみましょう。この例では、CityとStateの2つの列で構成されるロケーションテーブルがあります。
次に、次のクエリを実行して、テーブルから個別の都市の数を見つけます。
1
2
|
SELECT COUNT(DISTINCT(City))
FROM Location;
|
一意の都市数2(グルガオン)の数を返します
データを見ると、同じような都市名が別の場所に存在しています。状態も。都市と州の組み合わせは一意であり、その一意の組み合わせが出力から削除されることは望ましくありません。
列の組み合わせに対してSQLDISTINCT関数を使用することもできます。値の組み合わせをチェックし、組み合わせが一意でない場合は削除します。
1
2
|
SELECT DISTINCT City、State
FROM Location;
|
重複する都市名は出力から削除されません値の一意の組み合わせのためです。
ロケーションテーブルにもう1行挿入しましょう。
1
|
場所の値に挿入( “グルガオン”、” Haryana “)
|
5つのレコードがありますロケーションテーブル。データでは、一意ではない都市と州の組み合わせが1つあることがわかります。
SELECTDISTINCTを再実行します関数であり、今回は4行のみを返す必要があります。
SQL COUNTDISTINCT関数を複数の列で直接使用することはできません。 。次のエラーメッセージが表示されます。
一時テーブルを使用してSQLDISTINCT関数からレコードを取得し、 count(*)を使用して、行数を確認します。
1
2
3
4
|
SELECT DISTINCT City、State
into #Temp
FROM Location;
#Tempからcount(*)を選択します
|
出力で行数4を取得します。
列の組み合わせを使用して区別する場合値といずれかの列にNULL値が含まれている場合、SQLServerの一意の組み合わせにもなります。
これを確認するために、ロケーションテーブルにさらにレコードを挿入しましょう。このクエリでは状態を指定しませんでした。
1
2
|
場所の値に挿入( “Gurgaon”、 “”)
location(city)values( “Gurgaon”)に挿入
|
ロケーションテーブルのデータを見てみましょう。
クエリを再実行して区別しますロケーションテーブルの行。
1
2
|
個別の市、州を選択
FROM場所;
|
出力では、削除されていないことがわかりますCityとStateの組み合わせと空白またはNULL値。
同様に、SQLCOUNTで行数6を確認できます。 DISTINCT関数。
SELECT COUNT、COUNT(*)、SQLCOUNTの違い
COUNT |
Count(*) |
Count(Distinct) |
where句で指定された条件を満たす後の行の総数を返します。 |
where句で指定された条件を満たす後の合計行数を返します。 |
where句で指定された条件を満たす後の個別の行数を返します。 。 |
行数を示します。重複する値は削除されません。 |
重複するNULL値に関係なく、すべての行が考慮されます。 |
NULLと重複値を削除した後の個別の行数。 |
出力のNULL値を削除します。 |
出力のNULL値を削除しません。 |
出力のNULL値を削除します。 |
SQLCount個別関数の実行計画
SQL COUNTDISTINCT関数の実際の実行計画を見てみましょう。以下に示すように、SSMSメニューバーから実際の実行プランを有効にする必要があります。
クエリを実行して実際の実行プランを取得します実行計画。この実行プランでは、リソースを消費する上位の演算子を確認できます。
- 並べ替え(個別の並べ替え)–コスト78%
- テーブルスキャン–コスト22%
並べ替え演算子の上にマウスを置くと、演算子の詳細が記載されたツールヒントが開きます。
プロパティウィンドウでは、メモリ割り当て、統計、行数など、並べ替え演算子に関する詳細も表示されます。
100万レコードのテーブルでは、個別のカウント演算子はコストのかかる演算子であるため、SQL CountDistinctによってパフォーマンスの問題が発生する可能性があります。実際の実行プラン。
SQL Server 2019は、新しいApprox_count_distinct関数を使用してSQL COUNTDISTINCT演算子のパフォーマンスを向上させます。 SQL Server 2019のこの新しい機能は、おおよその個別の行数を提供します。 SQLCountdistinct関数とApprox_Count_distinct関数の出力にわずかな違いがある場合があります。
SQL COUNT DISTINCTをキーワードApprox_Count_distinctに置き換えて、SQL Server2019からこの関数を使用できます。
1
2
|
SELECT APPROX_COUNT_DISTINCT(City)
FROM Location;
|
この関数の詳細については、新しいSQL Server2019関数のApprox_Count_Distinctを参照してください。
結論
この記事では、さまざまな例を使用してSQLCOUNT関数について説明しました。また、SQL Server 2019から利用できる新しいSQL関数Approx_Count_distinctについても説明しました。環境に応じて、それらを確認することをお勧めします。コメントや質問がある場合は、下のコメントに自由に残してください。
- 作成者
- 最近の投稿
彼は、SQL Server Always On可用性グループに関する50部構成のシリーズで、単一のトピックに関する記事の最大の無料オンラインコレクションの1つを作成しています。 SQL Serverコミュニティへの貢献に基づいて、彼はSQLShackで2020年と2021年に継続的に名誉ある「今年のベストオーサー」を含むさまざまな賞を受賞しています。
Rajは常に新しい課題に関心を持っているため、コンサルティングが必要な場合は彼の著作で取り上げられている主題についてのヘルプは、rajendra.gupta16 @ gmail.comに連絡できます。
RajendraGuptaによる投稿をすべて表示
- SQLServerのセッションタイムアウトAlwaysOn Availabilityグループ-2021年2月8日
- AWS RDS SQLServerのマイナーバージョンとメジャーバージョンのアップグレードの実行-2021年1月29日
- AWS RDSPostgreSQLインスタンスのデプロイ-2021年1月27日