根据先前的值从表中删除行

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 FROM odds 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)跨度>

以上是关于根据先前的值从表中删除行的主要内容,如果未能解决你的问题,请参考以下文章

根据另一个表中的值删除行

根据表中其他列的值从同一表中的 2 列中选择信息

jquery根据选择值从表中填充文本输入

根据其中一个表中的值从多个表中获取 SQL 结果

SnowFlake 存储过程根据条件从表中删除一行

根据另一个表中的值从日期列中减去分钟