sql >> データベース >  >> RDS >> SQLite

SQLiteのCount()結果から重複を削除

    count()を使用する場合 SQLiteで機能する場合、個別の値のみをカウントしたい状況に陥る可能性があります。つまり、重複する値が複数回カウントされることは望ましくありません。

    つまり、列に同じ値が複数回ある場合は、その値を1回だけカウントする必要があります。

    デフォルトでは、count() 計算にはすべての重複する値が含まれます。たとえば、値「Cat」が3回出現する場合、count() それを3としてカウントします。

    ただし、個別の値のみをカウントする場合は、count() 1としてカウントされます。

    幸い、これを行う簡単な方法があります。 DISTINCTを追加するだけです。 count()のキーワード 働き。このように:

    count(DISTINCT x)

    ここでx カウントするコンテンツの列名(またはアスタリスクワイルドカードを使用している場合は行全体)です。

    次の表を見てください:

    ProductId   ProductName    Price     
    ----------  -------------  ----------
    1           Widget Holder  139.5     
    2           Blue Widget    10.0      
    3           Red Widget     10.0      
    4           Green Widget   10.0      
    5           Widget Stick   89.75     
    6           Foo Cap        11.99     

    行2から4はすべて同じ価格(10.0)であることに注意してください。

    通常のcount()を実行すると 価格 列、6行すべてをカウントします。

    SELECT count(Price) FROM Products;

    結果:

    6

    ただし、DISTINCTを追加すると キーワードの場合、これらの3行を1つとしてカウントします。

    SELECT count(DISTINCT Price) FROM Products;

    結果:

    4

    個別の行をカウント

    count() 関数はアスタリスクワイルドカード(*)を受け入れます )、これはすべての行をカウントすることを意味します。

    ただし、DISTINCTを使用しようとすると、エラーが発生する可能性があります アスタリスクワイルドカードを使用する場合。

    これは、行が重複しているテーブルです。

    Postal      State             
    ----------  ------------------
    NSW         New South Wales   
    NSW         New South Wales   
    QLD         Queensland        
    TAS         Tasmania          
    SA          South Australia   
    WA          Western Australia 
    VIC         Victoria          

    理論的には、DISTINCTを使用できるはずです。 このテーブルの「重複排除された」行をカウントします。ただし、それは不可能のようです。

    SELECT count(DISTINCT *)
    FROM States;

    結果:

    Error: near "*": syntax error

    代わりに、DISTINCTを使用するときに列名を指定する必要があります キーワード。

    SELECT 
      count(State),
      count(DISTINCT State)
    FROM States;

    結果:

    count(State)  count(DISTINCT State)
    ------------  ---------------------
    7             6                    
    >

    別の方法は、次のようなことです。

    SELECT count(*) FROM (SELECT DISTINCT * FROM States);

    結果:

    6

    ただし、このような重複行を許可するデータベース設計は一般的に適切ではないため、これは実際には問題にはなりません。


    1. SQL ComplianceManager5.9の一般提供の発表

    2. サブクエリカーディナリティ推定のバグ

    3. Oracle:保留中のトランザクションがあるかどうかを確認するにはどうすればよいですか?

    4. macOSでのmy.cnfファイルの場所