如何选择出现在特定值之前的行?

Posted

技术标签:

【中文标题】如何选择出现在特定值之前的行?【英文标题】:How can I select the rows that appear before a specific value? 【发布时间】:2020-12-10 22:09:17 【问题描述】:

我有一张包含以下信息的表格:

CREATE TABLE A (
    ID int,
    start_date varchar(255),
    effdate varchar(255),
    enddate varchar(255),
    lead_effdate varchar(255),
    value varchar(255),
    source varchar(255),
    lead_source varchar(255)
);
INSERT INTO A
VALUES (1,"12/01/2013","12/01/2013","30/07/2014","31/07/2014",4,"REM","REM"),
(1,"31/07/2014","31/07/2014","04/09/2014","12/09/2014",4,"REM","REM"),
(1,"12/09/2014","12/09/2014","12/04/2015","13/04/2015",4,"REM","REM"),
(1,"13/04/2015","13/04/2015","01/01/2016","02/01/2016",4,"REM","REM"),
(1,"02/01/2016","02/01/2016","11/03/2016","13/03/2016",4,"REM","REM"),
(1,"13/03/2016","13/03/2016","22/04/2017","10/07/2016",4,"REM","GS"),
(1,"10/07/2016","10/07/2016",null,"23/04/2017",4,"GS","REM"),
(1,"23/04/2017","23/04/2017","05/05/2018","06/05/2018",4,"REM","REM"),
(1,"06/05/2018","06/05/2018","09/11/2019","10/11/2019",4,"REM","REM"),
(1,"10/11/2019","10/11/2019",null,null,4,"REM",null);

select * from A
order by start_date

我想删除从 source = GS 到表中最低行的所有行。如您所见,顺序由 start_date 给出。

我尝试使用 row_number() over(partition by... 在 GS 周围创建负值和正值,但我无法计算此索引。您将如何解决?

【问题讨论】:

数据没有意义,varchar 必须用引号括起来,也总是将日期保存为日期而不是 varchar 并在您仅选择它时对其进行格式化 all rows from source = GS to the bottom?你说的是什么顺序?所有带有source >= 'GS'的行? 那不是有效的 SQL。提示:日期值使用DATE 类型,编码为ISO-8601 format,如YYYY-MM-DD 提示:12/01/2013 的结果是什么?考虑SELECT 12/01/2013 对桌子感到抱歉。我更正了这些值,它现在应该可以工作了。 【参考方案1】:

如果“到底部”是指“更大的 id”,那么您可以在 delete 中使用 join

delete a
    from a join
         (select max(id) as gs_id
          from a
          where source = 'GS'
         ) aa
         on a.id > aa.gs_id;

【讨论】:

【参考方案2】:

您希望选择日期等于或晚于 source = 'GS' 的行的所有行。由于source = 'GS' 可以有多行,因此您必须决定一行。可能是第一个或最后一个。

delete from a where start_date >= (select min(start_date) from a where source = 'GS');

【讨论】:

Databricks 不支持删除。你知道另一种方法吗? 我不知道数据块。您的问题已标记为mysql。我的答案是符合标准的 DELETE 语句,适用于 MySQL 和任何其他 RDBMS。 ...我刚刚在 Google 上搜索了 databricksdelete:docs.databricks.com/spark/latest/spark-sql/language-manual/… 看起来它支持 SQL 语句错误:AnalysisException:DELETE 目标仅支持增量源。如您所见,除非表存储在 Delta 源中,否则 Databricks 不支持删除,我不能这样做。 好的。那我帮不上忙。对不起。我知道 SQL 和几个 RDBMS。我不知道 Databricks。

以上是关于如何选择出现在特定值之前的行?的主要内容,如果未能解决你的问题,请参考以下文章

Pandas:如何根据特定列上特定值的条件选择数据框中的行[重复]

仅选择在特定时间出现的行

如何从同一个表中选择特定单元格的行?

选择顶部的行,直到特定列中的值出现两次

如何提高 SQL Server 查询的性能以选择具有值的行不在子查询中的一次计数

如何使不满足特定条件的行不出现在结果中