[[20090515232142]] 『複数項目の並び替え』(ポロン) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『複数項目の並び替え』(ポロン)
以下のような競馬データがあります。
年月日 レース番号 競馬場コード 馬名
 20070901	08	札幌	アートオブウォー          	
 20070128	09	京都	アートオブウォー          	
 20070218	06	京都	アートオブウォー          	
 20070422	06	京都	アートオブウォー          	
 20061217	04	阪神	アートオブウォー          	
 20070317	07	阪神	アートオブウォー          	
 20070901	12	札幌	アイアムザヒロイン         	
 20050327	08	阪神	アイアムザヒロイン         	
 20050919	09	札幌	アイアムザヒロイン         	
 20060723	09	新潟	アイアムザヒロイン         	
 20070520	12	新潟	アイアムザヒロイン         	
 20050312	12	中京	アイアムザヒロイン         	
 20051211	08	中京	アイアムザヒロイン         	
 20061210	08	中京	アイアムザヒロイン         	
 20050417	07	中山	アイアムザヒロイン         	
             ・
             ・
             ・            
             ・
             ・
 このデータを次の条件で並び替えたいと考えています。    

 @基準となる日付は2007年9月1日(20070901)である。(データは全て2007年9月1日以前のものです)
 A馬名が共通のもので、2007年9月1日以前のデータがある場合、それを並べていく
 Bデータの並び替えは2007年9月1日の中で各競馬場でのレース番号の数字の若い順から である。

 例えば2009年9月1日新潟1レース以降の出馬表は
 年月日	レース番号	競馬場コード	馬名
 20070901	01	新潟	ハイカックウ            
 20070901	01	新潟	ミヤギフェアリー          
 20070901	01	新潟	マイネルアフェット         
 20070901	01	新潟	チョコクランチ           
 20070901	01	新潟	ポコアポコフォルテ         
 20070901	01	新潟	コスモグラスゴー          
 20070901	01	新潟	ダイワアンリ            
 20070901	01	新潟	ワンサイド             
 20070901	01	新潟	ヒロノグレガ            
 20070901	01	新潟	レオパンドラ            
 20070901	01	新潟	シトラスサン            
 20070901	01	新潟	コスモドリーミン          
 20070901	01	新潟	クリプトジュエル          
 20070901	01	新潟	マイネルナチューラ         
 20070901	01	新潟	マイシルバースター         
 20070901	01	新潟	ステラダルク            
 20070901	01	新潟	モアスマイル              

 20070901	02	新潟	サチノスクランブル         
 20070901	02	新潟	コスモコマンダ           
 20070901	02	新潟	トップオブマジック         
 20070901	02	新潟	ホウリイキッド           
 20070901	02	新潟	ヒラボクシャトル          
 20070901	02	新潟	トレノクリスエス          
 20070901	02	新潟	レオソリスト            
 20070901	02	新潟	ストロングマリオン         
 20070901	02	新潟	マイネルフェスタ          
 20070901	02	新潟	エターナルロマンス         
 20070901	02	新潟	グルービーアイズ          
 20070901	02	新潟	ステディーラブ           
 20070901	02	新潟	メジロガストン           
 20070901	02	新潟	エーシンダカーポ          
 20070901	02	新潟	マッシュアップ           
 20070901	02	新潟	エンゲージメント                             
            ・            
            ・
            ・
            ・
 となっていますが、上記の条件を適用させると
 年月日	レース番号	競馬場コード	馬名
 20070901	01	新潟	ハイカックウ
 20070901	01	新潟	ミヤギフェアリー          
 20070729	01	新潟	ミヤギフェアリー          
 20070630	05	福島	ミヤギフェアリー
 20070901	01	新潟	マイネルアフェット         
 20070812	01	新潟	マイネルアフェット         
 20070722	06	新潟	マイネルアフェット
 20070901	01	新潟	チョコクランチ           
 20070804	06	新潟	チョコクランチ
 20070901	01	新潟	ポコアポコフォルテ         
 20070805	02	新潟	ポコアポコフォルテ         
 20070715	05	新潟	ポコアポコフォルテ 
             ・ 
             ・ 
             ・ 
             ・ 
 20070901	02	新潟	サチノスクランブル         
 20070804	01	新潟	サチノスクランブル         
 20070722	01	新潟	サチノスクランブル         
 20070630	05	福島	サチノスクランブル
 20070901	02	新潟	コスモコマンダ           
 20070804	01	新潟	コスモコマンダ           
 20070701	05	福島	コスモコマンダ 
             ・
             ・
             ・
             ・
             ・ 

 というように表示したいと考えています。
 SQLには詳しくありませんが
 ORDER句で優先する列を決めていけば問題が解決できるかと考えています。
 どなたか御教授の方、宜しくお願いします。
                   
                                      


 並べ替えキーを作成し、並べ替えを行う方法です。
 E列以降を作業列に使用します。
          [A]        [B]          [C]        [D]                      [E]          [F]         [G]
[1]     年月日   レース番号  競馬場コード    馬名                   作業列1    作業列2   並べ替えキー
[2]    20070901      01          新潟        ハイカックウ         20070901_01     1001         1001
[3]    20070901      01          新潟        ミヤギフェアリー     20070901_01     1002         1002
[4]    20070729      01          新潟        ミヤギフェアリー     20070729_01                  1002
[5]    20070630      05          福島        ミヤギフェアリー     20070630_05                  1002
[6]    20070901      01          新潟        マイネルアフェット   20070901_01     1003         1003
[7]    20070812      01          新潟        マイネルアフェット   20070812_01                  1003
[8]    20070722      06          新潟        マイネルアフェット   20070722_06                  1003
[9]    20070901      01          新潟        チョコクランチ       20070901_01     1004         1004
[10]   20070804      06          新潟        チョコクランチ       20070804_06                  1004
[11]   20070901      01          新潟        ポコアポコフォルテ   20070901_01     1005         1005
[12]   20070805      02          新潟        ポコアポコフォルテ   20070805_02                  1005
[13]   20070715      05          新潟        ポコアポコフォルテ   20070715_05                  1005
[14]   20070901      02          新潟        サチノスクランブル   20070901_02     2001         2001
[15]   20070804      01          新潟        サチノスクランブル   20070804_01                  2001
[16]   20070722      01          新潟        サチノスクランブル   20070722_01                  2001
[17]   20070630      05          福島        サチノスクランブル   20070630_05                  2001
[18]   20070901      02          新潟        コスモコマンダ       20070901_02     2002         2002
[19]   20070804      01          新潟        コスモコマンダ       20070804_01                  2002
[20]   20070701      05          福島        コスモコマンダ       20070701_05                  2002
[21]                                                                   _                       #N/A
[22]                                                                   _                       #N/A

 E2
=A2&"_"&B2
 F2
=IF(A2=20070901,B2*1000+COUNTIF(E$2:E2,E2),"")
 G2
=VLOOKUP(D2,D$1:F$10000,3,FALSE)

 基準日が変わる場合は、F2式の日付を変更して下さい。
 また、データ範囲が10,000行を超える場合は
 G2式の範囲を広げて下さい。

 並べ替え前に 年月日が降順
 或いは、同一馬名の中では基準日のデータが
 上側の行に来る場合は、F列の作業列を省略し
 F2に
=IF(A2=A$2,B2*1000+COUNTIF(E$2:E2,E2),VLOOKUP(D2,D$1:F1,3,FALSE))
 の式でも並べ替えキーを作成する事が出来ます。

 (HANA)

 HANAさん
 御回答ありがとうございます。
 二か月以上解らなかった問題が解けました。(初心者ですいません)

 追加で御質問させていただきたいのですが、
 このエクセルのデータはMS Accessからエクスポートしてきたものでして、
 最初のセルのデータは全て「文字列」として記録されています。
 この状態では御回答いただきました式が認識されず、意味を成さなかったので、
 文字列を「数値」に変換しました。その結果正しく表示されるようになったのですが、
 如何せんデータの数が多すぎるため、全てのデータ変換に時間がかかり過ぎてしまいました。
 そのため、文字列を数値に変換する時間を短縮する方法を教えていただけないでしょうか?

 また上記でAccessを使ってということでしたが、今回の並び替え処理をAccess内で行う方法は無いでしょうか?
 エクセルの質問版で聞くのは恐縮ですが、何か御存知の場合、教えていただければ幸いです。
 宜しくお願いします。
 (ポロン)


 どの方法を使って居られますかね?
=IF(A2=20070901,B2*1000+COUNTIF(E$2:E2,E2),"")
 の式なら、日付部分を文字列で判定してもらえば良いと思います。
=IF(A2="20070901",B2*1000+COUNTIF(E$2:E2,E2),"")

 或いは、エクスポートする際 基準にする日付をどこかに
 一緒に書きだしておいて(例えばH2セル)
=IF(A2=$H$2,B2*1000+COUNTIF(E$2:E2,E2),"")
 の様にしても良いかもしれません。

 ちなみに
 文字列を数値に直すには
 メニュー・データ→区切り位置
 で、列毎に一括で変換可能です。

 Accessでの処理をご希望と言うことですが
 私はAccessは持っていないので、他の方のレスを待つか
 世の中にはAccessのQ&A掲示板も有ると思いますので
 そちらで質問されるのが良いかもしれません。
 その際、そのURLをこちらへリンクしておいてもらえると
 こちらで分かる人が、出向いてコメントを付けてくれるかも知れませんので
 良いかもしれません。

 (HANA)


HANAさん
  >どの方法を使って居られますかね?
 =IF(A2=20070901,B2*1000+COUNTIF(E$2:E2,E2),"")
 を使っていましたが、文字列を変換する方法を用いることで
 問題が解決しました。
 ありがとうございます。

 > 世の中にはAccessのQ&A掲示板も有ると思いますので
 そちらで質問されるのが良いかもしれません。

 そうさせて頂きます。色々なアドバイスありがとうございました。

 あら
=IF(A2="20070901",B2*1000+COUNTIF(E$2:E2,E2),"")
 で上手く行きませんでしたか?

 こちらでも出来るかもしれません。
=IF(A2*1=20070901,B2*1000+COUNTIF(E$2:E2,E2),"")

 >文字列を変換する方法
 だと、一手間増えちゃいますよね?

 (HANA)


HANAさん
 Accessで作業するには、基準キーが必要となるため、
 Accessからエクスポートしたエクセルデータに並び替えキーを付けて、
 再びAccessにインポートするという方法を取ろうと思います。

 データは2008年9月21日までのものがありまして、
 年月日で降順に並べると、

 年月日   レース番号  競馬場コード    馬名 
 20080921	1	札幌	コウヨウサルート          
 20080921	1	札幌	サルラ               
 20080921	1	札幌	エンリッチメント          
 20080921	1	札幌	ヘリテージゴールド         
 20080921	1	札幌	ローズブーケ            
 20080921	1	札幌	スイートメリー           
 20080921	2	札幌	フレアリングローズ         
 20080921	2	札幌	プリモカラーズ           
 20080921	2	札幌	ダイワポイズン           
 20080921	2	札幌	ハヤブサリーフ           
 20080921	2	札幌	ワニタレスタリ           
 20080921	2	札幌	カイテキプリン           
 20080921	2	札幌	キタノオハナ            
 20080921	2	札幌	ヒトメボレムスメ          
 20080921	2	札幌	テイエムオーロラ          
 20080921	2	札幌	ラブユニバース           
                   ・
                   ・
                   ・
                   ・
 20080412	12	阪神	マルブツセンター          
 20080412	12	阪神	テンシノコンコルド         
 20080412	12	阪神	ツルマルキセキ           
 20080412	12	阪神	ゼンノジュウシン          
 20080406	1	中山	サンデーチャリティ         
 20080406	1	中山	ケージーグラス           
 20080406	1	中山	ナイスラッキー           
 20080406	1	中山	シロッポ              
 20080406	1	中山	スマートサプライズ         
 20080406	1	中山	エプソムダーク           
 20080406	1	中山	ファイナルクロス          
 20080406	1	中山	ハクバドウジ            
 20080406	1	中山	マイネルスカイハイ         
 20080406	1	中山	コアグリーン            
 20080406	1	中山	マコトボムケッチ          
 20080406	1	中山	アンブロークン           
 20080406	1	中山	ダイワチェイサー          
 20080406	1	中山	シルクパナシア           
 20080406	1	中山	ツクバエリザベス          
 20080406	2	中山	テンエイファルコン         
 20080406	2	中山	ソフィアクィン           
                    ・
                    ・
                    ・
                    ・ 

 というものになります。
 前回までは2007年9月1日を基準日としていましたが、
 今回は「各日の各レースに出走した馬の番号を得る」という作業を行いたいと思います。 

 考えが二つありまして、
 @前回の F2=IF(A2=20070901,B2*1000+COUNTIF(E$2:E2,E2),"")
 の式は基準日が変わると値が表示されなくなる為、別の方法で作業列2を表示する。

 A出馬した年月日が若い順に馬名毎のナンバーをつける。
 例えばコウヨウサルートという馬は
 2008年9月21日の札幌第一レースに出馬しています。
 この馬の過去の出走を新しい日付から順に番号をつけて
 年月日	レース番号	競馬場コード	馬名    番号
 20080921	01	札幌	コウヨウサルート        1          
 20080817	01	札幌	コウヨウサルート        2          
 20080621	01	福島	コウヨウサルート        3          
 20080713	02	福島	コウヨウサルート        4          
 20080907	03	札幌	コウヨウサルート        5          
 20080830	03	札幌	コウヨウサルート        6          
 20080427	03	東京	コウヨウサルート        7

 というように表示したいと考えています。

 それぞれの方法に合う関数は有るでしょうか?          

 いまいちイメージが良く分からないのですが・・・・。

 馬名毎の、レース番号(昇順)の 年月日(降順)
 って事ですか・・・?

 >A出馬した年月日が若い順に馬名毎のナンバーをつける。
 →年月日の過去の物が下側に来るように と言うだけなら、
  年月日     レース番号  競馬場コード        馬名          番号
 20080921       01         札幌        コウヨウサルート     1
 20080907       03         札幌        コウヨウサルート     5
 20080830       03         札幌        コウヨウサルート     6
 20080817       01         札幌        コウヨウサルート     2
 20080713       02         福島        コウヨウサルート     4
 20080621       01         福島        コウヨウサルート     3
 20080427       03         東京        コウヨウサルート     7

 の順になりそうですが・・・。

 (1)と(2)は独立した物ではなく 続きなんですかね?
 (1)で書いて居られるイメージも 良く分からないので・・・
 もう少し沢山の例を挙げて教えて下さい。

 (HANA)

HANAさん
 単純に年月日が新しいか古いかだけで考えていただけると
 良いかと思います。
 となると、
 年月日    馬名          番号
 20080921	コウヨウサルート	1
 20080907	コウヨウサルート	2
 20080830	コウヨウサルート	3
 20080817	コウヨウサルート	4
 20080713	コウヨウサルート	5
 20080621	コウヨウサルート	6
 20080427	コウヨウサルート	7
 になるような表示にしたいと思います。

 @とAは独立したもので、 
年月日	レース番号	競馬場コード	馬名	   作業列1	作業列2	並べ替えキ-
20080921	1	札幌	コウヨウサルート            20080921_1	1001	1001
20080921	1	札幌	サルラ                 20080921_1	1002	1002
20080921	1	札幌	エンリッチメント          20080921_1	1003	1003
20080921	1	札幌	ヘリテージゴールド         20080921_1	1004	1004
20080921	1	札幌	ローズブーケ                20080921_1	1005	1005
20080921	1	札幌	スイートメリー               20080921_1	1006	1006
20080921	2	札幌	フレアリングローズ             20080921_2	2001	2001
20080921	2	札幌	プリモカラーズ       	       20080921_2	2002	2002
20080921	2	札幌	ダイワポイズン     	       20080921_2	2003	2003
20080921	2	札幌	ハヤブサリーフ        	       20080921_2	2004	2004
20080921	2	札幌	ワニタレスタリ              20080921_2	2005	2005
20080921	2	札幌	カイテキプリン      	       20080921_2	2006	2006
20080921	2	札幌	キタノオハナ       	       20080921_2	2007	2007
20080921	2	札幌	ヒトメボレムスメ     	       20080921_2	2008	2008
20080921	2	札幌	テイエムオーロラ    	       20080921_2	2009	2009
20080921	2	札幌	ラブユニバース      	       20080921_2	2010	2010
20080921	2	札幌	ジョーイリス       	       20080921_2	2011	2011
20080921	2	札幌	ラストダンス       	       20080921_2	2012	2012
20080921	3	札幌	サトノミラクル      	       20080921_3	3001	3001
20080921	3	札幌	テンシノザール            20080921_3	3002	3002
20080921	3	札幌	レッドハイヒール     	       20080921_3	3003	3003
                    ・
                    ・
                    ・
                    ・ 
とここまでは前回と同じく基準日を20080921に変更した
F2=IF(A2=20080921,B2*1000+COUNTIF(E$2:E2,E2),"")
でできるのですが、途中で日付が変わるとまたそこで基準日を変更しなければならなく
なります。
よって式をコピーしていって、基準日が変わっても並び替えキーが表示できるような方法を教えて
頂けないでしょうか?


 ん・・・?
 もしかして、最初の並べ替えとは別の話ですか?
 それで、「並べ替えが必要」と言う事ではないのですか?

 >今回は「各日の各レースに出走した馬の番号を得る」という作業を行いたいと思います。
 これは「並べ替える」のではなく
 「○日の×レース」と指定すると「誰」と出てくるような物を作りたい
 って事ですか?

 「番号を得る」ってのが、具体的にどういったことなのか・・・。
 並べ替えキー の事 = 馬の番号 の事
 でしょうか?

 どちらも、エクセルでは
 (1) 年月日・降順 レース番号・昇順
 (2) 馬名順 年月日・降順
 だけで、作業列を使用する事も無いと思うのですが・・・。

 Accessに入れたときに、簡単に並べ替えられるように
 エクセル側でキーを作っておきたい って事ですかね?
 1.馬名毎の 基準日のレース番号の降順 で並べる
 2.各日付降順の レース番号の昇順 に並べる
 3.馬名毎に 年月日を降順 に並べる

 ちなみに、「コウヨウサルート」の例では
 番号が1〜振られていますが 馬名毎にリセットして
 1から番号を振れば良いのですかね・・・?
 (>3.馬名毎に 年月日を降順 に並べる
  ではなく
  >3.年月日を降順 に並べる
  で良い?)

 そこで、もう少しお伺いしてみますが
 出力されたときのデータというのは、
 何の並びになっているのですか?

 それから、競馬のことは全く疎くてお恥ずかしいのですが
 レース番号の最大の番号 と言うのは決まっているのでしょうか?
 その場合、何番が最大になるのですか?

 これとは別の件で気になる所が有るのですが・・・。
 エクセルで日付を値に直すことにされた様ですが
 それをAccessに戻したときに、既にあるAccessのデータとの
 関連がつけにくくなりそうに思いますが、その点は問題無いのですか?

 (HANA)

HANAさん
 段々、話がややこしくなってきているようで申し訳ないです。
 私の説明力不足です。
 一つ目の御質問からお答えします。
 >もしかして、最初の並べ替えとは別の話ですか?
 そうです。一番最初にしていた質問とは全く別個の物とお考えください。

 >>今回は「各日の各レースに出走した馬の番号を得る」という作業を行いたいと思います。
 >これは「並べ替える」のではなく
 >「○日の×レース」と指定すると「誰」と出てくるような物を作りたい
 >って事ですか?
 ここではまだその情報は必要無いと思います。

 >Accessに入れたときに、簡単に並べ替えられるように
 >エクセル側でキーを作っておきたい って事ですかね?
 まさにその通りです。Accessではエクセルのように式を入力して新しく列を
 増やすというのはやり難いようなので、エクセルで作ってしまおうと考えています。

 >ちなみに、「コウヨウサルート」の例では
 >番号が1〜振られていますが 馬名毎にリセットして
 >1から番号を振れば良いのですかね・・・?
 「リセット」のイメージが少し判らなかったのですが、
 年月日の新しい順番が判れば良いかと思います。
 「番号」という言葉が曖昧に見えたようなので補足しますと、
 コウヨウサルートが一番新しく出走したのは2008年9月21日で、
 2番目に新しいのは2008年9月7日・・・
 というような情報を得たいという意味です。

 >そこで、もう少しお伺いしてみますが
 >出力されたときのデータというのは、
 >何の並びになっているのですか?
 これはイマイチ私にもわからないのですが、2007年9月1日の第一レースから並んでいるようで
 何を基準としているのか明確になっていない状態です。すいません

 >レース番号の最大の番号 と言うのは決まっているのでしょうか?
 >その場合、何番が最大になるのですか?
 基本、1日の各レース場ごとで12レースまであります。これは特別な日以外
(有馬記念等)では常に同じです。

  >これとは別の件で気になる所が有るのですが・・・。
 >エクセルで日付を値に直すことにされた様ですが
 >それをAccessに戻したときに、既にあるAccessのデータとの
 >関連がつけにくくなりそうに思いますが、その点は問題無いのですか?

 今まで色々なことをお聞きしていましたが、御回答を吟味していく中で、
 「本当にこれを基準にして良いのか?」という考えが浮かんできています。
 HANAさんが危惧されているように、余計なことをして逆にやりにくくなる可能性も
 あります。ただ、色々と考えても、結局何かを試してみないと判らないな
 という結論に達しました。
 どうかお付き合いいただけますよう、宜しくお願いします。


 >>レース番号の最大の番号 と言うのは決まっているのでしょうか?
 >>その場合、何番が最大になるのですか?
 >基本、1日の各レース場ごとで12レースまであります。これは特別な日以外
 >(有馬記念等)では常に同じです。
 特別な日は、増えるのですかね?減るのですかね?

 良く分かっていませんが・・・・

 降順にすると、日付順のレース順に成ります。
=A2&"_"&TEXT(100-B2,"0000")

 各馬名毎に、直近の物から数えて
 何回目に出現したかを表示します。
=SUMPRODUCT((D$2:D2=D2)*(A$2:A2>A2))+1

 とかですか?

 (HANA) 

 HANAさん
 >特別な日は、増えるのですかね?減るのですかね?
 減ります。12レースを超えることは無いです。

 その他の式、いろいろ試してみます。

 長い間お付き合い頂き、ありがとうございました。

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.