2012-01-27 3 views
2

私は統計的なデータを持つテーブルを持っています。時間範囲内でレコードを1回だけカウントするにはどうすればよいですか?

バージョンごとにグループ化されたレコードを数えようとしていますが、レコードに別の基準(ref)があり、1回のみ(1回の参照で)カウントする必要があるという問題があります。問題を説明するため

統計のサンプルデータ:

id stat_date ref version 
------------------------- 
1 2012-01-25 1 A 
2 2012-01-25 2 B 
3 2012-01-25 3 A 
4 2012-01-26 8 B 
5 2012-01-26 2 B 
6 2012-01-26 3 B <-- version has been updated for ref=3 

単純なカウントが

SELECT COUNT(*),version FROM stat GROUP BY version 

1,A 
5,B 

ここでの問題は、= 3(ID = 6)でなければなりませんREFとその唯一の最後のレコードであるを返しますカウントされ、(id = 3)は無視されなければならない。 質問から、行(id = 3)をクエリからどのようにフィルタリングできますか?私は、サブクエリ

SELECT COUNT(*),version FROM stats 
WHERE stat_date BETWEEN "2012-01-25" AND "2012-01-26" 
AND id = (SELECT MAX(id) FROM stats WHERE <condition>) 
GROUP BY 2 

に条件として挿入すべきかを把握することはできません

期待される結果は次のようになります。

1,A (since id=3 is ignored) 
3,B (since the first id=2 is ignored and only id=5 is taken into account) 
+0

@ Jaitsuは1列目にcount(*)を、2列目にグループ化しているためです。 – Bohemian

+0

@Jaitsu列リスト(バージョン)の2番目の引数を意味します。 – stacker

+0

@stacker、毎日新しいことを学ぶ! – JamesHalsall

答えて

1

てみな質問を満たすに答えます

SELECT COUNT(*),version 
FROM stats s1 
WHERE stat_date BETWEEN "2012-01-25" AND "2012-01-26" AND 
     not exists (SELECT null 
        FROM stats s2 
        WHERE s1.ref = s2.ref and s2.id>s1.id) 
GROUP BY version 

EDIT:常には保証されませんが、仕事:

SELECT COUNT(*),version from 
(select * from 
(select * from stats 
    where stat_date BETWEEN "2012-01-25" AND "2012-01-26" 
    order by ref, id desc) s0 
group by ref) s1 
group by version 
+0

私のCOUNT(DISTINCT)と同じ結果を返します。どの行が実際に数えられても違いはありません... – gbn

+0

@gbn私の質問を更新しました – stacker

+0

@gbn:以前に提供されたデータでyesですが、レコードIDがバージョンAの場合、ref 3はバージョンB私のクエリでは、それはあなたのクエリのバージョンAとBに対してカウントされます。 –

0
SELECT COUNT(*),version FROM stats 
    WHERE stat_date BETWEEN "2012-01-25" AND "2012-01-26" 
     AND id = (SELECT MAX(s.id) FROM stats s WHERE s.id = id) 
    GROUP BY version 
    ORDER BY stat_date 
+0

申し訳ありませんが、これは1行だけを返しました – stacker

+0

GROUP BYを 'GROUP BY id、version'に変更する方法 – JamesHalsall

2

それはどの行にあなたの問題ではありません。無視する。あなたが望むのは、refを一度カウントすることだけです。

SELECT COUNT(DISTINCT ref),version FROM stat GROUP BY version 

編集:

あなたの例では、あなたのロジックに従ってREF = 2度だけでなく2行をカウントする必要があります。

これが提起した、それはあなたの未知の本当の問題が解決しない場合でも、

+0

ありがとうございます、unfourtunatly私は最新のものを数える必要があることを忘れてしまいます。それにも解決策がありますか? – stacker

+0

@stacker:まあ、あなたの本当の*問題を投稿してください。私はあなたの質問にちょうど答えました – gbn

+0

少なくとも、 "(id = 6)を数え、(id = 3)は無視しなければならない"と言ってこれを暗示しようとしました。 – stacker

関連する問題