2015-11-12 2 views
1

У меня есть таблица, которая обновляется каждую неделю.Автоматизация очереди назначения с sql

Кто-то затем вытаскивает таблицу вниз, присваивает значения, где QueueT имеет значение null, на основе уже присвоенного номера и типа.

Подумайте об этом как о системе очередей, чтобы выравнивать рабочий процесс как можно более равномерно.

Im застрял при попытке автоматизировать кусок присваивания

http://sqlfiddle.com/#!3/6a657/1

показывает, сколько присваиваются каждому человеку, но как бы я получил об обновлении таблицы для назначения каждого человека в зависимости от типа и даже назначений как можно больше?

-- create temp table code if needed 

create table #tempqueue 

(
    QueueT varchar(20) 
    ,Type varchar(20) 
) 

insert into #tempqueue 
(
    QueueT 
    ,Type 
) 

values 
('bob' , 'type1'), 
('bob' , 'type1'), 
('john' , 'type2'), 
('john' , 'type2'), 
('john' , 'type2'), 
('null' , 'type1'), 
('null' , 'type1'), 
('null' , 'type1'), 
('null' , 'type1'), 
('null' , 'type2'), 
('null' , 'type2'), 
('tim' , 'type1'), 
('bob' , 'type1'), 
('jill' , 'type2'), 
('jack' , 'type2'), 
('john' , 'type2'), 
('null' , 'type1'), 
('null' , 'type1'), 
('null' , 'type1'), 
('null' , 'type1'), 
('null' , 'type2'), 
('null' , 'type2'), 
('null' , 'type2') 


select 


    QueueT 
    ,type 
    ,count(Type) counttype 

from #tempqueue 


group by 
    QueueT 
    ,type 
+0

Является ли «null» человеком или может рассматриваться как человек? (На самом деле строковое значение «null» - это плохая идея - слишком легко путать с значением базы данных «null». Возможно, вместо этого используйте «none»). – Turophile

+0

@Turophile его фактический null, я быстро написал таблицу создания и не заметил этого. – lookslikeanevo

ответ

1

Во-первых, вам нужен уникальный идентификатор для таблицы, так каждая запись может обновляться по отдельности:

create table tempqueue 

(
    id int identity(1,1) 
    ,QueueT varchar(20) 
    ,Type varchar(20) 
) 

Затем вы можете обновить его с помощью пары вложенных запросов, min, count и row_number оконная функция:

create table tempqueue 

(
    id int identity(1,1) 
    ,QueueT varchar(20) 
    ,Type varchar(20) 
) 

insert into tempqueue 
(
    QueueT 
    ,Type 
) 

values 
('bob' , 'type1'), 
('bob' , 'type1'), 
('john' , 'type2'), 
('john' , 'type2'), 
('john' , 'type2'), 
(null , 'type1'), 
(null , 'type1'), 
(null , 'type3'), 
(null , 'type1'), 
(null , 'type2'), 
(null , 'type2'), 
('tim' , 'type1'), 
('bob' , 'type1'), 
('jill' , 'type2'), 
('jack' , 'type2'), 
('john' , 'type2'), 
(null , 'type1'), 
(null , 'type1'), 
(null , 'type1'), 
(null , 'type1'), 
(null , 'type2'), 
(null , 'type2'), 
(null , 'type2') 

-- loop through records until no records are updated 
declare @rows_updated int = 1 
while @rows_updated > 0 
    begin 
     update t 
      set t.QueueT = u.QueueT 
      from tempqueue t 
       -- get min record id per type where QueueT is null 
       inner join (select Type,min(id) id 
          from tempqueue 
          where QueueT is null 
          group by Type) id 
        on id.Type = t.Type 
        and id.id = t.id 
       -- get QueueT for each Type with the least count 
       inner join (select QueueT,Type, 
           row_number() over(partition by Type order by cnt) lst 
          from (select QueueT,Type,count(*) cnt 
            from tempqueue 
            where QueueT is not null 
            group by QueueT,Type)c)u 
        on u.Type = id.Type 
        and u.lst = 1 
      set @rows_updated = @@rowcount 
    end 

select QueueT,Type,count(*) cnt 
from tempqueue 
group by QueueT,Type 

SQL FIDDLE

+0

спасибо, попробуем это сегодня – lookslikeanevo

+1

спасибо, что он работает красиво. один вопрос - если нет совпадений, как я могу предотвратить бесконечный цикл? – lookslikeanevo

+0

Я обновил запрос и SQL FIDDLE, чтобы использовать @@ rowcount, чтобы определить, были ли обновлены строки. Если обновлено 0 строк, цикл завершается. Я добавил тип 3, чтобы продемонстрировать это, и я заменил строки «null» нулевыми значениями в свете комментариев по вашему вопросу. –

Смежные вопросы