2016-04-29 14 views
1

私は SQLで一意の値を取得する方法は?

event_date id ---------- --- 2015-11-18 x1 2015-11-18 x2 2015-11-18 x3 2015-11-18 x4 2015-11-18 x5 2015-11-19 x1 2015-11-19 x2 2015-11-19 y1 2015-11-19 y2 2015-11-19 y3 2015-11-20 x1 2015-11-20 y1 2015-11-20 z1 2015-11-20 z2 

以下の質問
のようなテーブルがあります:どのようにすべての日付のIDのユニークな数を取得するために(私たちは、以前の記録に見られなかっただけで、これらのIDのカウントを取得するように)?

event_date count(id) 
----------- --------- 
2015-11-18  5 
2015-11-19  3 
2015-11-20  2 

各IDは、同じ日付グループ内にあるかどうかに関係なく、1回のみカウントする必要があります。

+1

タグ下さい使用DBMS。 –

+2

MySQL、SQL Server、Oracle、PostgreSQLなどを実行していますか? – zedfoxus

答えて

4

は、私は私がそれを好きかわからないが、うまくいく答えです。

これは実際にこのデータのために動作しますが、あなただけの重複したIDの成っ日付のグループがあった場合z2であるため、例えば、行の中で、あなたはもう一つの行('2016-01-01', 'z2')を持っていた場合、これはその2016-01-01のためのすべてのレコードを表示しません重複あなたは結果内の行を返すために必要がある場合:

2016年1月1日0

を、その後、あなたはGROUP BYでJOINをLEFTを使用する必要があります。

sqlfiddleここ

+0

あなたは確かにテストしましたか?内側のクエリがまったく正しいとは思われません。内部のGROUP BYを見てみましょう。 – freetiger

+0

はい、私はそれをテストしましたが、MySQL上では違うはずはありません。内側のクエリは、各IDがデータ内で1回だけ発生することを保証しますが、私が言ったように、特定の日付のカウントである0を期待するときにはエッジ条件を注意してください。 – Spade

+0

SQL92以前では、選択リスト、HAVING条件、またはORDER BYリストがGROUP BY句に指定されていないか、GROUP BY句で機能的に依存している非集約列を参照するクエリは許可されません。 https ://dev.mysql.com/doc/refman/5.7/en/group-by-handling.html – freetiger

4

あなたは可能性があり、日付でグループやグループごとのIDへの明確な回数適用されます。

SELECT event_date, COUNT(DISTINCT id) 
FROM  mytable 
GROUP BY event_date 
+2

これは繰り返しidには対処しません。これは、* across *日付よりもむしろid *を削除するためです。上記の – zimdanen

+0

のコメントは間違いありません!明確にするために、IDは以前の日付で一度も見られなかった場合、UNIQUEと呼ばれます。 – freetiger

+3

私はなぜ人が間違った答えをアップ投票しているのか分かりません。彼らはその質問を読んでいますか? – freetiger

-1
SELECT 
    mytable.event_date 
    event_date_count.id, 
    event_date_count.event_date_count 
FROM 
    mytable 
    INNER JOIN 
     (
     SELECT 
      id, 
      event_date, 
      COUNT(event_date) as event_date_count 
     FROM 
      mytable 
     GROUP BY 
      id, 
      event_date 
     ) event_date_count 
    ON event_date_count.event_date = mytable.event_date 

をこれはあなたの日付の結果セット、ID、および何回そのIDを与えるだろうその日に発見された。

集約を使用したselect文で結合の力を発揮します。

select t.event_date, 
     count(1) 
from ( 
     -- Record first occurrence of each id along with the earliest date occurred 
     select id, 
       min(event_date) as event_date 
     from 
     mytable 
     group by id 
    ) t 
group by t.event_date; 

私は私はあなたが望んでいた結果を得るためにあなたのデータでテストするので、それは動作します知っている:ここで

+1

これは動作しません。再度質問を確認してください! – freetiger

0
SELECT EVENT_DATE,COUNT (DISTINCT ID) 
FROM  MYTABLE 
WHERE NOT EXISTS 
     (SELECT * FROM MYTABLE T2 WHERE  
     T2.EVENT_DATE<MYTABLE.EVENT_DATE AND T2.ID=MYTABLE.ID) 
GROUP BY EVENT_DATE 
+0

これも動作します! – freetiger

+0

ご希望の場合は、その答えをご確認ください –

0

編集:クラップ、申し訳ありませんスペード。以下は、簡単なevent_dateエントリのためにゼロを表示したい場合、Spadeが参照していたものの例です。私はこの線に沿って何かをするだろう

...

select 
a.event_date, 
count(a.id) cnt_id 
from 
table_name a 
left outer join 
(
    select x.id, min(x.event_date) min_event_date from table_name x 
) b on 
    a.id = b.id AND 
    a.event_date = b.min_event_date 
GROUP BY 
a.event_date 
関連する問題