2016-10-26 6 views
0

私は潜在的に数十万行までのテーブルを持っています。各行は、特定の申請者による国勢調査ブロック内の資金調達の申請書を表しています。私はほんの数百行を持っている場合は、私はこれを使用して、その国勢調査ブロック内の各アプリケーションにランクを割り当てることができます。これは、その年の国勢調査ブロック内単価によって、各アプリケーションをランク付けするために正常に動作しAccessでグループ内のレコードをランク​​付けする効率的な方法は何ですか?

SELECT art1.CFA_Plus, art1.Census_Block_ID, 
    (SELECT count(*) + 1 
FROM AppReferenceTable art2 
WHERE art2.State_Cost_Per_Unit < art1.State_Cost_Per_Unit AND 
art2.Census_Block_ID = art1.Census_Block_ID) AS Rank_In_Block   
FROM AppReferenceTable AS art1; 

。しかし、それは私のテストテーブルで約60,000行を窒息する。より良い方法がありますか?または、私は何を間違っているのですか?

ありがとうございます!

+0

ライブを計算するのが余りにも多くなると、結果を保存できます。 AppReferenceTableにフィールドを追加し、それをランクで塗りつぶすUPDATEクエリを作成します。毎晩実行するようにスケジュールします。すぐに最新のデータを持っていない限り、契約を破ることができます、それは仕事を行います。 – SunKnight0

+0

サブクエリがMS ACCESSに対して最適化されていないため、各レコードを再計算する必要があり、これがパフォーマンスに影響します。このような大規模なデータセットを処理するには、専用のDBMSに移行する必要があります。 MySQLは無料で、引き続きMS Accessのフロントエンドを使用して、これらすべての優れたSQL操作を利用することができます。 –

答えて

0

自分自身でテーブルに参加することは、そのトリックを実行します。

SELECT art1.Census_Block_ID, art1.CFA_Plus, art1.State_Cost_Per_unit, COUNT(*) As Rank 
FROM appreferencetable as art1 
LEFT JOIN appreferencetable as art2 
ON art1.Census_Block_ID = art2.Census_Block_ID AND art2.State_Cost_Per_Unit <= art1.State_Cost_Per_unit 
GROUP BY art1.Census_Block_ID, art1.CFA_Plus, art1.State_cost_per_unit 
関連する問題