- PR -

指定日付の直近のデータを絞り込みカウント

1
投稿者投稿内容
192.168.1.1
会議室デビュー日: 2007/07/23
投稿数: 2
投稿日時: 2007-07-23 11:27
はじめまして

みなさまの知恵をお借りしたく
書き込みさせていただきます。

とても初歩的なSQLとなってしまうのかもしれませんが
よろしくおねがいします。


以下のデータがあるとします

コード:
名前  点数 日時
Aさん 10   2007/01/01
Aさん 0    2007/01/12
Aさん 20   2007/01/23
Aさん 0    2007/01/31
Aさん 30   2007/01/23

Bさん 10   2007/01/15
Bさん 0    2007/01/25
Bさん 80   2007/01/30

Cさん 80   2007/01/30

Dさん 10   2007/01/10
Dさん 0    2007/01/28
Dさん 10   2007/01/29



この場合に
ある日時の、直近の点数が0点じゃない人数をカウントするには
どのようにすればよいでしょうか。

たとえば、2007/01/26を指定した場合は結果として「2」
が帰ってくるといったかんじです。(AさんとDさんが該当)

かずくん
ぬし
会議室デビュー日: 2003/01/08
投稿数: 759
お住まい・勤務地: 太陽系第三惑星
投稿日時: 2007-07-23 12:32
で、使用しているDBMSは何?
表式(Inline View)が使用できるのなら、以下のように展開していくとできそう

1.まず、指定日直近のレコードを取得する
コード:
select 
	名前, max(日時) as 日時
from
	テーブル
where
	日時 <= '2007/1/26'
group by
	名前



2.そのレコードに対して、点数が0でないレコードを取得するよう修正
コード:
select 
	T.名前
from
	テーブル T
join (select 
		名前, max(日時) as 日時
	from
		テーブル
	where
		日時 <= '2007/1/26'
	group by
		名前
) V
on T.名前 = V.名前 and T.日時 = V.日時
where
	T.点数 <> 0



3.最後に集計するよう修正
コード:
select 
	count(T.名前)
from
	テーブル T
join (select 
		名前, max(日時) as 日時
	from
		テーブル
	where
		日時 <= '2007/1/26'
	group by
		名前
) V
on T.名前 = V.名前 and T.日時 = V.日時
where
	T.点数 <> 0



ただし一点問題があります。
どこまでがキーなのかが分からないことです。
上述したSQLは、名前と日時をキーとみなしました。
が、Aさんの2006/1/23日のレコードが複数件あるので破綻しています。

全列をキーとみなして、1.を行えばよさそうに見えますが、
コード:
select 
	名前, 点数, max(日時) as 日時
from
	テーブル
where
	日時 <= '2007/1/26'
group by
	名前, 点数


となり、Aさんが複数件のまま取得されてしまい、おそらく最終的に3件となることでしょう。
192.168.1.1
会議室デビュー日: 2007/07/23
投稿数: 2
投稿日時: 2007-07-23 13:53
>かずくんさん
順をおってわかりやすく解説していただきありがとうございます。
DBMSはSybaseです
ご指摘のとおり3のSQLでできました!

Joinの使い方も少しわかりました。

>上述したSQLは、名前と日時をキーとみなしました。
>が、Aさんの2006/1/23日のレコードが複数件あるので破綻しています。
手入力したのでこちらはただの入力ミスです^^;
いろいろ察していただき助かりました。
1

スキルアップ/キャリアアップ(JOB@IT)