2015-10-20 63 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 

我想做的事情上与行表的更新:
- 具有栏的ID活跃='O'不止一次。
- 其中有多次激活='O'的这些行中,更新应将激活的值更改为'N',除了max(record)将保持激活状态='O'。

在我的例子,有列有效= 'O' 不止一次的ID与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和max记录到临时表中,然后在进行更新之后,此代码可能还需要一些更改,因为我只是一眼就指向你指向的方向,我会这么做

+0

谢谢!这也起作用。 – Jake