2015-10-20 2 views
2

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

------------------------------ 
id | active| record 
------------------------------ 
3 | O  | 2015-10-16 
3 | O  | 2015-10-15 
3 | N  | 2015-10-14 
4 | N  | 2015-10-15 
4 | O  | 2015-10-14 

Я хочу сделать обновление на столе на линиях с:
- идентификатор, имеющий столбец active = 'O' более одного раза.
- Среди строк, имеющих активную = 'O' более одного раза, обновление должно изменить значение active на 'N', за исключением одного с max (запись), которое останется с активным = 'O'.

В моем примере, идентификатор, имеющий в столбце Active = 'O' больше, чем один раз ID = 3.

id |active | record 
------------------------------ 
3 | O  | 2015-10-16 
3 | O  | 2015-10-15 
3 | N  | 2015-10-14 

Я хочу иметь этот результат:

id |active | record 
------------------------------ 
3 | O  | 2015-10-16 
3 | N  | 2015-10-15 
3 | N  | 2015-10-14 

Я попытался это запрос, но есть ошибка:

update test as t1, 
(select id 
from test 
where active = 'O' 
group by id 
having count(*) > 1) as t2 
set t1.actif = 'N' 
where t1.record != max(t2.record); 

Заранее благодарен!

+0

Я использую MySQL. – Jake

ответ

0

Учитывая этот образец данных:

CREATE TABLE t 
    (`id` int, `active` varchar(1), `record` date) 
; 

INSERT INTO t 
    (`id`, `active`, `record`) 
VALUES 
    (3, 'O', '2015-10-16'), 
    (3, 'O', '2015-10-15'), 
    (3, 'N', '2015-10-14'), 
    (4, 'N', '2015-10-15'), 
    (4, 'O', '2015-10-14') 
; 

Этот запрос

UPDATE 
t 
JOIN (
    SELECT 
    id, MAX(record) AS max_record 
    FROM 
    t 
    WHERE active = 'O' 
    GROUP BY id 
    HAVING COUNT(*) > 1 
) sq ON t.id = sq.id 
SET t.active = IF(t.record = sq.max_record, 'O', 'N'); 

производит этот результат:

+------+--------+------------+ 
| id | active | record  | 
+------+--------+------------+ 
| 3 | O  | 2015-10-16 | 
| 3 | N  | 2015-10-15 | 
| 3 | N  | 2015-10-14 | 
| 4 | N  | 2015-10-15 | 
| 4 | O  | 2015-10-14 | 
+------+--------+------------+ 
0

Вы можете попробовать что-то вроде этого

select ID, 
count(*) Counted, 
max(record) record 
into #TempTable from Table 
where Active = 'O' 
group by ID 

Update tab 
set tab.Active = 'N' 
from Table tab 
join #tempTable temp on tab.ID = temp.ID 
where temp.Counted > 1 and 
tab.record != temp.record 

drop table #tempTable 

В принципе, вы просто считаете Os, хватая ID и максимальную запись в таблицу темп, и после этого вы делаете обновление, также этот код может потребоваться некоторые изменения, так как я просто взглянул на вас в направлении, которое я сделал бы это

+0

Спасибо! это тоже работает. – Jake

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