2

Stata を使用して解決できた問題がありますが、データのサイズが大きくなり、メモリから処理できなくなりました。代わりにMySQLでこれを行いたいと思っています。nグループ間のアイテムのマンハッタン距離を計算しようとしています。これまでにデータを操作したので、計算のために準備ができていることを願っています。

SELECT * FROM exampleshares;

+----------+-------------+-------------+
| item     | group       | share       |
+----------+-------------+-------------+
| A        | group1      |  .3         |
| B        | group1      |  .7         |
| A        | group2      |  .2         |
| B        | group2      |  .6         |
| C        | group2      |  .2         |
| A        | group3      |  .3         |
| C        | group3      |  .6         |
+----------+-------------+-------------+

この例のマンハッタン距離は次のようになります。

+----------+-------------+-------------+
| groupX   | groupY      | M distance  |
+----------+-------------+-------------+
| group1   | group1      | 0           |
| group1   | group2      |  .4         |
| group1   | group3      | 1.3         |
| group2   | group1      |  .4         |
| group2   | group2      | 0           |
| group2   | group3      | 1.1         |
| group3   | group1      | 1.3         |
| group3   | group2      | 1.1         |
| group3   | group3      | 0           |
+----------+-------------+-------------+

たとえば、group1 と group2 の間の距離は |.3-.2|+|.7-.6|+|0-.2|=0.4 として計算されます。シェアの絶対差の合計。MySQL でこれを行うにはどうすればよいですか?

私の検索中に、グループごとに前の行との差を計算するためのいくつかの解決策が見つかりましたが、特に探しているものには何もありません。

4

1 に答える 1

0

これを行うには、ストアド ルーチンまたはその他のスクリプトを使用する必要があると思います。これを行うストアドルーチンを次に示します。

delimiter //
drop procedure if exists manhattanDistance//
create procedure manhattanDistance (in startGroup char(32), in endGroup char(32), out manhattanDistance decimal(2,1))
    not deterministic
    reads sql data
begin
  drop table if exists tmp_items;
  create temporary table tmp_items as select distinct item from exampleshares;

  select sum(abs(ifnull(es1.share, 0) - ifnull(es2.share, 0))) into manhattanDistance
    from tmp_items ti
    left join exampleshares es1 on es1.item = ti.item and es1.group = startGroup
    left join exampleshares es2 on es2.item = ti.item and es2.group = endGroup;
end//
delimiter ;

call manhattanDistance('group1', 'group2', @distanceBetweenGroup1And2);
select @distanceBetweenGroup1And2;
于 2013-05-13T07:49:21.557 に答える