标准: 1)2列(column1,column2)的唯一组合
2)保留最新的组合
3)记录可能相同,即同一列1,列2和创建日期在这种情况下需要具有较小id的那个。
e.g。数据如下:
ID column1 column2 creation_date(dd-mm-yyyy)
1 11 aa 10/5/2016
2 11 aa 11/6/2016
3 12 bb 10/5/2017
4 12 bb 20-05-2017
5 12 cc 10/5/2016
6 12 cc 11/5/2017
7 13 dd 10/1/2018
8 13 dd 10/1/2018
我需要保存id为1,3,5,7
的记录我想到的方法是:
a)首先编写选择查询以获取所需记录(在此示例中为1,3,5,7)
b)使用更新查询(软删除)编写更新查询以将状态更改为已删除
另外,请建议是否有其他更好的方法来满足标准。
其他信息: *总记录数:11k
*我不想直接从表中获取记录,而不是我有一个只获取所需数据的查询,需要对这些记录运行查询
*最终目的是修改要删除的重复记录的状态,并将删除的字附加到这些记录
答案 0 :(得分:0)
如果您使用分析函数,这非常简单。该查询包含三个部分:
A)为每条记录分配一个等级,如下所示: 按列1和列2分组记录。在每个组中,首先按creation_date对ID进行排序,然后按ID进行排序。将1分配给第一条记录,将2分配给第二条记录,依此类推。
B)仅保留重复项,即具有较新creation_date和/或ID的记录。 rnk = 1的记录将是您请求的记录。记录与rnk> 1是重复的。
C)使用ROWID删除重复项
delete
from your_table
where rowid in(-- (C)
select duplicate_rowid
from (select rowid as duplicate_rowid
,row_number() over( -- (A)
partition by column1, column2 -- Your criterion 1
order by creation_date asc -- Your criterion 2
,id asc -- Your criterion 3
) as rnk
from your_table
)
where rnk > 1 -- (B)
);
答案 1 :(得分:0)
因此,针对我的问题的最终查询如下:
1)获取记录数/获取所需列:
$professors = array("Andrew Besmer", "Gerry Derksen");
2)更新status = deleted的记录,并将_deleted word附加到column1值:
$professors[] = $andrewUser;
$professors[] = $gerryUser;
foreach ($professors as $professor) {
echo "<h2>" . $professor->profile->getFirstName() . "</h2>";
etc...
}