如何选择出现在特定值之前的行?
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 上搜索了 databricks
和 delete
:docs.databricks.com/spark/latest/spark-sql/language-manual/… 看起来它支持。
SQL 语句错误:AnalysisException:DELETE 目标仅支持增量源。如您所见,除非表存储在 Delta 源中,否则 Databricks 不支持删除,我不能这样做。
好的。那我帮不上忙。对不起。我知道 SQL 和几个 RDBMS。我不知道 Databricks。以上是关于如何选择出现在特定值之前的行?的主要内容,如果未能解决你的问题,请参考以下文章
Pandas:如何根据特定列上特定值的条件选择数据框中的行[重复]