【问题标题】:SQL retrieve all rows between two dates and a specific number of rows before the date ordered by dateSQL 检索两个日期之间的所有行以及按日期排序的日期之前的特定行数
【发布时间】:2020-06-02 21:50:36
【问题描述】:

正如标题所说,我有一个带有日期列的表格。我正在尝试检索 2 个日期之间的所有行以及按日期排序的开始日期之前的 X 行。

按日期 DSC 从表中选择 *

20200201
20200101
20191201
20191101
20191001
20190901
20190801
20190701

我想要介于 20200201 和 20191201 之间以及前 3 行(不知道日期)

result
20200201
20200101
20191201
20191101
20191001
20190901

我当前的查询由于某种原因返回了一组随机的联合之间的高日期:

(SELECT * FROM Table WHERE Date BETWEEN 20200201 AND 20191201 ORDER BY Date ASC)
UNION
(SELECT * FROM Table WHERE Date < 20191201 ORDER BY Date DESC LIMIT 3)

知道我哪里出错了吗?

【问题讨论】:

  • 你得到了多少行结果?您的 'Date BETWEEN'-coditions 对我来说似乎是倒退的,这应该会给您 0 个结果,从连接的底部只留下 3 行结果。请注意,不过我从未使用过 Postgres SQL。
  • 对不起,是Mysql。我切换了日期,它确实使查询变得更糟。它给了我一些第一个选择和第二个选择的 1 个
  • 在末尾添加 ORDER BY,对 UNION 的结果进行排序。 (子查询的结果集顺序不会保留在子查询之外。)也许切换到 UNION ALL。
  • 抱歉这么久才回来。问题正如 jarlh 指出的那样,没有保留子查询的顺序(这就是事情混乱的原因),整个 UNION 的简单 ORDER BY 解决了这个问题。我没有尝试 Gordon 的回复,因为这解决了我的问题

标签: mysql sql union between


【解决方案1】:

一种方法使用lead()

select t.*
from (select t.*,
             lead(date, 3) over (order by date) as next_date_3
      from t
     ) t
where (date < '202o-02-01' and (next_date_3 >= '2020-02-01' or next_date_3 is null) ) or
      (date between '2020-02-01' and '2019-12-01')

【讨论】:

    【解决方案2】:

    我试过这个查询,它对我有用:

    (SELECT * FROM Table WHERE Date BETWEEN  20191201 AND 20200201 ORDER BY Date ASC)
    UNION
    (SELECT * FROM Table WHERE Date < 20191201 ORDER BY Date DESC LIMIT 3)
    

    第一个选择显示我:

    20191201
    20200101
    20200201
    

    第二个选择显示我:

    20191101 
    20191001 
    20190901 
    

    【讨论】:

    • 是的,两个查询都选择了我想要的,我可以通过编程方式添加它们,但是我想从查询中获取它。
    • 对不起@James,我不太明白你的问题。工会对我来说很好。我得到那六行。您能否提供有关您的问题的更多详细信息?注意:请注意我在第一个查询中切换了您的参数日期。
    【解决方案3】:

    问题正如 jarlh 指出的那样,子查询的顺序没有保留(这就是事情混乱的原因),整个 UNION 的简单 ORDER BY 解决了这个问题。我没有尝试 Gordon 的回复,因为这解决了我的问题:

    (SELECT * FROM Table WHERE Date BETWEEN  20191201 AND 20200201)
    UNION
    (SELECT * FROM Table WHERE Date < 20191201 ORDER BY Date DESC LIMIT 3)
    ORDER BY Date ASC
    

    谢谢

    【讨论】:

      猜你喜欢
      • 2013-09-03
      • 2013-10-07
      • 1970-01-01
      • 2018-09-15
      • 1970-01-01
      • 2017-06-12
      • 1970-01-01
      • 2021-04-23
      • 1970-01-01
      相关资源
      最近更新 更多