こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

X個グループからY個ずつデータを抽出したい

例:グループの数は100ぐらいがあって、グループごとのレコード数はそれぞれであり、毎回そのうちのX(例3)グループずつにデータを抽出します。そして1つのグループから最大Y個(例2)のデータを抽出します。
抽出したデータにフラグを立てて、次の抽出時に除外の条件として使います。

例:以下のテーブルがあって、毎回3グループから2個のデータを抽出します:

group name flag
----------------------------------------------------------------------------
1_group 田中A          0    
1_group 佐藤A          0    
1_group 林A           0    
1_group 鈴木A           0    
1_group 牧野A           0    


2_group 平田B          0    
2_group 小林B          0    
・・・
3_group 高橋C          0    
3_group 丹羽C          0    
3_group 田中C          0    
3_group 佐藤C          0    
3_group 鈴木C          0    
3_group 吉田C          0    
・・・
4_group 高橋D          0    
4_group 丹羽D          0    
4_group 田中D          0    
4_group 佐藤D          0    
4_group 鈴木D          0    
・・・


(1)1回目の抽出の結果
group name flag
----------------------------------------------------------------------------
1_group 田中A          0    
1_group 佐藤A          0    
2_group 平田B          0    
2_group 小林B          0    
3_group 高橋C          0    
3_group 丹羽C          0    

(2)2回目の抽出の結果
group name flag
----------------------------------------------------------------------------
1_group 林A           0    
1_group 鈴木A           0    
3_group 田中C          0    
3_group 佐藤C          0    
4_group 高橋D          0    
4_group 丹羽D          0    

(3)3回目の抽出の結果
group name flag
----------------------------------------------------------------------------
1_group 牧野A           0    
3_group 鈴木C          0    
3_group 吉田C          0    
4_group 田中D          0    
4_group 佐藤D          0    

DBはSqlLiteです。

長いですが、ご教授頂ければ、ありがたいです

投稿日時 - 2018-01-25 14:23:52

QNo.9422107

困ってます

質問者が選んだベストアンサー

「抽出したデータにフラグを立てて、次の抽出時に除外の条件として使います。」は、後回しにして、「グループごとに22個抜き出したい」は、次のように rank()を使って書けます。
元テーブルをTA、その主キーをK_Aとすると

select * from
(select rank() over (partition by grp order by K_A) as R,
K_A,grp,name,flag from TA) as F where (F.R <= 22);

抜き出すグループは33個まで、という条件も加えるなら

select * from
(select rank() over (partition by grp order by K_A) as R,
K_A,grp,name,flag from TA) as F
inner join (select distinct grp from TA limit 33) as G using(grp)
where (F.R <= 22);

「抽出したデータにフラグを立てて、次の抽出時に除外」は、temporary tableを作る権限があるなら、上記の抽出結果の主キーをtemp tableに取っておいて、それに無いものを選ぶようにするとか。

投稿日時 - 2018-01-27 14:45:44

お礼

返事が遅くなって、すみませんでした。
今回のDBはSqliteなので、rank()は使えないようです。
でも他のDBならとても役に立つ答えと思います。
ありがとございました。

投稿日時 - 2018-02-09 09:41:16

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(1)