2016-10-26 7 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, каждая запись должна быть пересчитана, и это влияет на ее производительность. Обращаясь к такому большому набору данных, вы уже должны были подумать о переходе к выделенной СУБД. 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 
Смежные вопросы