根据先前的值从表中删除行
Posted
技术标签:
【中文标题】根据先前的值从表中删除行【英文标题】:Delete rows from table depending on previous value 【发布时间】:2021-04-11 13:06:23 【问题描述】:我的数据集如下所示:
internal_id | match_id | company_id | market_id | selection_id | odd_value | update_date |
---|---|---|---|---|---|---|
1 | 8576748 | 66 | 1 | 1 | 1.31 | 2021-01-05 17:59:41 |
36730 | 8576748 | 66 | 1 | 1 | 1.30 | 2021-01-05 18:58:41 |
47053 | 8576748 | 66 | 1 | 1 | 1.31 | 2021-01-05 19:59:41 |
2 | 8576748 | 66 | 1 | 2 | 14.00 | 2021-01-05 17:59:41 |
36731 | 8576748 | 66 | 1 | 2 | 14.00 | 2021-01-05 18:58:41 |
47054 | 8576748 | 66 | 1 | 2 | 14.00 | 2021-01-05 19:59:41 |
3 | 8576748 | 66 | 1 | 3 | 3.75 | 2021-01-05 17:59:41 |
36732 | 8576748 | 66 | 1 | 3 | 3.75 | 2021-01-05 18:58:41 |
47055 | 8576748 | 66 | 1 | 3 | 3.75 | 2021-01-05 19:59:41 |
我需要删除相同 match_id+company_id+market_id+selection_id 的先前奇数值相同的行。在此示例中,应删除 internal_id 为 36731、47054、36732、47055 的行。
如您所见,这不是重复删除,第 1 行和第 47053 行是相同的(对于 match_id+company_id+market_id+selection_id),但它们应该保持原样,因为odd_value 1,30(对于 internal_id 36730)是不同的比之前的奇值和奇值 1,31(对于 internal_id 47053)与之前的奇值不同。
为了列出这些数据,我使用了这个查询:
SELECT
`internal_id`,
`match_id`,
`company_id`,
`market_id`,
`selection_id`,
`odd_value`,
`update_date`
FROM
`odds`
WHERE
`match_id` = 8576748
AND `company_id` = 66
ORDER BY `match_id`, `company_id`, `market_id`, `selection_id`, `update_date`
【问题讨论】:
【参考方案1】:您可以通过以下方式区分要删除的行并以相同的方式编写删除语句:
SELECT *
,CASE WHEN LAG(odd_value) OVER (PARTITION BY match_id, company_id , market_id,selection_id ORDER BY update_date) = odd_value THEN 1 ELSE 0 END AS tobeDeleted
FROM `odds`
【讨论】:
你能帮我删除吗?我有这个查询: SELECT * FROM ( SELECT *, CASE WHEN LAG(odd_value) OVER( PARTITION BY match_id, company_id, market_id, selection_id ORDER BY update_date ) = odd_value THEN 1 ELSE 0 END AS duplikat FROModds
ORDER BY @987654323 @, company_id
, market_id
, selection_id
, update_date
) AS innerTable WHERE duplikat = 1 但无法正确删除,我尝试使用 WHERE internal_id IN 但它不起作用
我想我是这样处理的:DELETE FROM odds
WHERE internal_id
IN (SELECT internal_id
FROM ( SELECT *, CASE WHEN LAG(odd_value) OVER( PARTITION BY match_id, company_id, market_id , selection_id ORDER BY update_date ) = odd_value THEN 1 ELSE 0 END AS duplikat FROM odds
ORDER BY match_id
, company_id
, market_id
, selection_id
, update_date
) AS innerTable WHERE duplikat = 1)跨度>
以上是关于根据先前的值从表中删除行的主要内容,如果未能解决你的问题,请参考以下文章