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

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

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

  1. |name |visited_property|visit_date_time |
  2. |Marry|Residence_inn |05-25-2020 15:00:01|
  3. |Marry|Residence_inn |05-25-2020 15:15:01|
  4. |Marry|Residence_inn |05-25-2020 15:30:01|
  5. |Marry|Hilton_garden |05-25-2020 17:10:01|
  6. |Marry|Marriott_hotel |05-25-2020 18:10:01|
  7. |Harry|Hilton_garden |05-26-2020 10:10:01|
  8. |Harry|Residence_inn |05-26-2020 12:10:01|
  9. |Harry|Hilton_garden |05-26-2020 15:10:01|

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

  1. |name |visited_property|visit_date_time |
  2. |Marry|Residence_inn |05-25-2020 15:00:01|
  3. |Marry|Hilton_garden |05-25-2020 17:10:01|
  4. |Marry|Marriott_hotel |05-25-2020 18:10:01|
  5. |Harry|Hilton_garden |05-26-2020 10:10:01|
  6. |Harry|Residence_inn |05-26-2020 12:10:01|
  7. |Harry|Hilton_garden |05-26-2020 15:10:01|

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

mfuanj7w

mfuanj7w1#

使用 lag() :

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

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

v440hwme

v440hwme2#

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

  1. # remove duplicate rows
  2. -- create a new temporary table
  3. CREATE TABLE tmp_table_name LIKE existing_table_name;
  4. -- add a unique constraint
  5. ALTER TABLE tmp_table_name ADD UNIQUE(column_name);
  6. -- scan over the existing table to insert entries in the temporary table
  7. INSERT IGNORE INTO tmp_table_name SELECT * FROM existing_table_name ORDER BY column_name;
  8. select * from tmp_table_name;
  9. -- rename tables
  10. RENAME TABLE existing_table_name TO existing_table_name_backup, tmp_table_name TO existing_table_name;
  11. -- drop the backup table
  12. drop table existing_table_name_backup;
  13. select * from existing_table_name;

相关问题