【问题标题】: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
  • 对桌子感到抱歉。我更正了这些值,它现在应该可以工作了。

标签: date pyspark apache-spark-sql databricks


【解决方案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 上搜索了 databricksdeletedocs.databricks.com/spark/latest/spark-sql/language-manual/… 看起来它支持
    • SQL 语句错误:AnalysisException:DELETE 目标仅支持增量源。如您所见,除非表存储在 Delta 源中,否则 Databricks 不支持删除,我不能这样做。
    • 好的。那我帮不上忙。对不起。我知道 SQL 和几个 RDBMS。我不知道 Databricks。
    猜你喜欢
    • 2020-12-21
    • 1970-01-01
    • 1970-01-01
    • 2020-11-04
    • 1970-01-01
    • 2011-07-04
    • 2016-10-29
    • 2020-10-04
    • 1970-01-01
    相关资源
    最近更新 更多