3 返信 最新の回答 日時: Mar 3, 2009 9:34 AM ユーザー:d.o

    ExcelにおけるRANK()関数的な処理

    d.o

      タイトル

      ExcelにおけるRANK()関数的な処理

      フォーラムに投稿

      みなさんこんにちは

      あるフィールドの値が現在の対象レコードの中で何番目に大きい値になるか(順位)を取得する方法を考えています。ExcelにおけるRANK()関数的な処理です。

       

      今やっている方法を書いてみます。

      対象レコードを順位を付けたい値のフィールドでソートします。

      フィールド内容の前置換で「シリアル番号で置き換え 初期値=1 増分=1」を実行。これは「Get(レコード番号)」でもいいと思います。

      ここまでで順位に近いものは出てますが同点の場合を処理しなくてはいけません。

      そこで、スクリプトで先頭のレコードから順に「一つ前のレコードと同点なら順位を同じにする」という処理を最後のレコードまで繰り返して実行させます。

      これで順位が取得されます。

       

      この方法でひとまず出来ているのですが...もっとスマートな方法は無いかと考えています。しかも、この方法ではスクリプトを実行する必要があるのでフィールドの値を変えただけでは順位に反映されません。

      皆様のお知恵をお貸し下さい。 

        • 1. Re: ExcelにおけるRANK()関数的な処理
          Hiro
            

          不等号式リレーションの関連フィールドの数をカウントする事で、動的に計算結果を得る方法です。

           

          先ず値フィールドを照合キーに不等号の自己リレーションを張ります。

           「値フィールド」 < 「自己::値フィールド」

          この関連レコードの数、つまり自己の値より大きい値のレコードの数をカウントします。この式は、

           「順位」式(計算結果:非保存、常時計算するにチェック)= Count(自己::値フィールド)+1

          この結果が求める降順順位の番号です。

          • 2. Re: ExcelにおけるRANK()関数的な処理
            Hiro
              

            現在の対象レコードの中で

            すみません、「対象レコードの中で」を見逃してました。以下を補足してください。

             

            もし、検索が「フィールド内容完全一致」、検索の結果なら、検索キーをリレーション照合キーに代えて先の自己リレーションの照合条件に加えます。

             「検索キー」  = 「自己::検索フィールド」

              and

             「値フィールド」< 「自己::値フィールド」

             

            もし、任意自由検索の結果なら、対象レコードを示すフラグ(値=使い捨て乱数値、式=Random)を「フィールド内容の全置換」で立てて、これを同じく、先の自己リレーションの照合条件に加えます。

             「乱数値」 = 「自己::フラグ」

              and

             「値フィールド」< 「自己::値フィールド」

            なお、一度切りで使い捨てできるよう無二の乱数を使っているので、次回の検索のためにフラグをクリアリセットする手間は不用です。

            • 3. Re: ExcelにおけるRANK()関数的な処理
              d.o
                

              Hiroさん

               

              教えていただいた方法でまさにやりたいことが出来ました。ありがとうございます。

              「対象レコード内で」 という条件も教えていただいた方法であれば必要なく(別のリレーションキーを使えば、別集計したいグループごとの集計も自動的になる)効率が格段にあがりました。

               

              とりあえず我流の方法でも目的の値を得ることは出来ていたのですが...教えていただいた方法のほうが断然スマートですね。質問して良かったです。

              ありがとうございました。