SQL Упорядочивание записей по «весу» - PullRequest
5 голосов
/ 28 октября 2011

У нас есть система, которая обрабатывает записи по «приоритетному» номеру в таблице. Мы определяем приоритет по содержимому таблицы, например,

UPDATE table
SET priority=3
WHERE processed IS NULL

UPDATE table
SET priority=2
WHERE balance>50

UPDATE table
SET priority=1
WHERE value='blah'

(пожалуйста, не обращайте внимания на тот факт, что между приоритетами могут быть «совпадения» :))

Это работает нормально - таблица обрабатывается в порядке приоритета, поэтому сначала обрабатываются все строки, в которых столбец «value» - «blah».

Мне дали задание добавить опцию, чтобы упорядочить записи по определенному «весу». Например, мы хотели бы, чтобы 50% обработки были приоритетными 1, 25% приоритетными 2 и 25% приоритетными 3. Поэтому из вышесказанного в каждых 100 записях 50 из них будут такими, где «value» равно «blah» ", 25 из них будут там, где" баланс "больше 50 и т. Д.

Я пытаюсь выяснить, как это сделать: какое-то взвешенное увеличивающееся значение для «приоритета» может показаться лучшим способом, но я не могу понять, как это кодировать. Может кто-нибудь помочь, пожалуйста?

РЕДАКТИРОВАТЬ: Извинения, должен был сказать: это работает на MSSQL 2008

Ответы [ 2 ]

5 голосов
/ 28 октября 2011

Общая идея состоит в том, чтобы собирать задачи в сегменты, разделенные по границе целых чисел:

select
  task_id
from (  
  select 
    task_id, 
    ((task_priority_order - 1) / task_priority_density) as task_processing_order
  from (
    select
      t.task_id                                            as task_id, 
      t.priority                                           as task_priority, 
      row_number() 
        over (partition by t.priority order by t.priority) as task_priority_order,
      case
        when t.priority = 3 then 50
        when t.priority = 2 then 25
        when t.priority = 1 then 25
      end                                                  as task_priority_density
    from
      table t
  )
)
order by task_processing_order

В диапазоне от 0,0 до 0. (9) мы получили 100 записей, построенных из первых 50 записей с приоритетом3, первые 25 записей с приоритетом 2 и первые 25 записей с приоритетом 1.

Следующий диапазон от 1,0 до 1. (9) представляет следующий пакет записей.

Если больше задач скакое-то значение приоритета, тогда оставшиеся задачи будут помещены в сегменты в том же соотношении.Например, если задач с приоритетом 3 недостаточно, остальные задачи будут упорядочены с соотношением 50/50.

task_id - некоторый суррогатный ключ для идентификации задачи.

PS Извините, я не могу проверитьэтот запрос сейчас, поэтому любая синтаксическая коррекция очень ценится.

Обновление: Синтаксис запроса исправлен в соответствии с комментариями.

0 голосов
/ 28 октября 2011

Данный тестовый скрипт обеспечивает следующий вывод.Если бы вы изложили некоторые правила о том, каким должен быть конечный результат, я хочу еще раз взглянуть на него.* Тестовый скрипт

DECLARE @Table TABLE (Priority INTEGER, Processed BIT, Balance INTEGER, Value VARCHAR(32))

INSERT INTO @Table VALUES 
  (NULL, NULL, NULL, NULL)
  , (NULL, 0, 49, NULL)
  , (NULL, 1, 49, NULL)
  , (NULL, 0, 50, NULL)
  , (NULL, 1, 50, NULL)
  , (NULL, 0, 51, NULL)
  , (NULL, 1, 51, NULL)
  , (NULL, 0, 51, 'Notblah')
  , (NULL, 1, 51, 'blah')

UPDATE @table SET priority=3 WHERE processed IS NULL
UPDATE @table SET priority=2 WHERE balance > 50
UPDATE @table SET priority=1 WHERE value = 'blah'

SELECT  *
FROM    @table
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...