純粋なPerlは間違いなくこのタスクに任されています。
テーブルをレコードの配列と考えてください。Perlで言えば、それはハッシュ参照の配列です。(AoAが適用される場合があります。TIMTOWTDIを覚えておいてください)
各ハッシュ参照のキーは列/フィールド名に対応しており、値はその特定のレコードの値になります。
OPの例をデータ構造に変換する:
my @data = (
{
ip => '1.1.1.1',
router => 'routerA',
state => 'texas',
},
{
ip => '2.2.2.2',
router => 'routerB',
state => 'texas',
},
{
ip => '3.3.3.3',
router => 'routerA',
state => 'california',
}
);
さて、楽しい部分です:
# Give me all IPs in Texas
my @ips_in_texas = map $_->{ip},
grep { $_->{state} =~ /texas/i }
@data;
# How many states does the data cover?
use List::MoreUtils 'uniq';
my $states_covered = uniq( map $_->{state}, @data );
# How many unique IPs in each state?
my %ips_by_state;
$ips_by_state{ $_->{state} }{ $_->{ip} }++ for @data;
print "'$_': ", scalar keys %{ $ips_by_state{$_} }, "\n" for keys %ips_by_state;
このデータ構造がメモリへの渇望に集中していることを示唆したときに私がよく受けるひざまずく反応。率直に言って、何百万ものレコードを扱っていない限り、それは問題にはなりません。その場合、DBMSは、Perlではなく、求める鉛筆削りソリューションです。