删除表中连续重复项的sql查询

smtd7mpg  于 2021-08-13  发布在  Java
关注(0)|答案(2)|浏览(418)

我有一张表格,格式如下:

|name |visited_property|visit_date_time    |
|Marry|Residence_inn   |05-25-2020 15:00:01|
|Marry|Residence_inn   |05-25-2020 15:15:01|
|Marry|Residence_inn   |05-25-2020 15:30:01|
|Marry|Hilton_garden   |05-25-2020 17:10:01|
|Marry|Marriott_hotel  |05-25-2020 18:10:01|

|Harry|Hilton_garden   |05-26-2020 10:10:01|
|Harry|Residence_inn   |05-26-2020 12:10:01|
|Harry|Hilton_garden   |05-26-2020 15:10:01|

我想写一个查询来获得他们访问的不同属性(以及访问顺序)的列表。如果他们连续参观同一处房产,我想算一次。如果他们不连续地参观同一家酒店,我想把参观次数分开计算。
理想情况下,我希望复制表,去掉连续的重复,得到这样的结果(去掉marry第二次和第三次访问residence inn,因为它连续三次访问该酒店,同时保留harry两次访问希尔顿花园,因为它们不是连续的):

|name |visited_property|visit_date_time    |
|Marry|Residence_inn   |05-25-2020 15:00:01|
|Marry|Hilton_garden   |05-25-2020 17:10:01|
|Marry|Marriott_hotel  |05-25-2020 18:10:01|

|Harry|Hilton_garden   |05-26-2020 10:10:01|
|Harry|Residence_inn   |05-26-2020 12:10:01|
|Harry|Hilton_garden   |05-26-2020 15:10:01|

我可以使用什么sql语句?谢谢你的帮助。

mfuanj7w

mfuanj7w1#

使用 lag() :

select t.*
from (select t.*,
             lag(visited_property) over (partition by name order by visit_date_time) as prev_visited_property
      from t
     ) t
where prev_visited_property is null or prev_visited_property <> visited_property;

这将返回每个属性的第一个匹配项 name .

v440hwme

v440hwme2#

再加一个怎么样 unique 约束。类似以下内容:


# remove duplicate rows

-- create a new temporary table
CREATE TABLE tmp_table_name LIKE existing_table_name;
-- add a unique constraint
ALTER TABLE tmp_table_name ADD UNIQUE(column_name);
-- scan over the existing table to insert entries in the temporary table
INSERT IGNORE INTO tmp_table_name SELECT * FROM existing_table_name ORDER BY column_name;
select * from tmp_table_name;
-- rename tables
RENAME TABLE existing_table_name TO existing_table_name_backup, tmp_table_name TO existing_table_name;
-- drop the backup table
drop table existing_table_name_backup;
select * from existing_table_name;

相关问题