【问题标题】:SQL - How to get the latest date that had any record prior to a specific date?SQL - 如何获取在特定日期之前有任何记录的最新日期?
【发布时间】:2019-09-18 03:29:28
【问题描述】:

我有一个如下表 t1:

 -----------------------------
 |    date   |  id   | value |
 -----------------------------
 | 2/28/2019 |  1    | 55  |
 | 2/28/2019 |  2    | 44  |
 | 2/28/2019 |  3    | 33  |
 | 2/26/2019 |  1    | 22  |
 | 2/26/2019 |  2    | 12  |
 | 2/26/2019 |  3    | 11  |
 -----------------------------

我想从 t1 中取出 abc3,然后在同一个表 t1 中找到日期 - 1 天的 abc3 值并显示两条记录。

我创建了一个查询:

select 
    a.date, a.id, (a.value - b.value) as 'difference-from-previous-day'
FROM 
    t1 a
INNER JOIN
    t1 b
ON 
    a.ID = b.ID
WHERE 
    b.DATE in (dateadd(day, -1, a.DATE));

当日期都在那里时,它工作得很好。

但是日期之间存在差距(例如,当我们查看星期一的数据并且星期一之前有一个“周末”时 - 表 t1 中没有最后一天 -1 的数据,所以这个查询显示星期一为 NULL )...

如何编写查询以获取当前日期之前的最后日期(而不是 -1 日期),其中存在数据?

预期结果:

2/28/2019 | 1 | 33     (which is "55 - 22")
2/28/2019 | 2 | 32     (which is "44 - 12")
2/28/2019 | 3 | 22     (which is "33 - 11")

谢谢。

【问题讨论】:

  • 您是否要查找今天之前的最新 ID 的最新日期?另外,您使用的是 SQL Server 还是 MySQL 或其他数据库?
  • 尝试查找任何 ID 的最新日期及其对应日期。所以例如星期一的 ID=5,查找星期一之前的最近一天(可能是星期五)和最近一天的 ID(星期五的 ID)。对于所有记录,这将是相同的逻辑。
  • 您使用的是哪种 DBMS 产品及其版本?在某些情况下,答案可能是特定于产品的。我敢打赌它是 MySQL,但不能确定是哪个版本。
  • 您的表中有一个 ID 列。是一周中的哪一天(周一、周二...)?
  • MySql和ID列不对应一天..

标签: mysql sql date


【解决方案1】:

你似乎想要:

select t1.*
from t1
where t1.value = 'abc'
order by t1.date desc
limit 2;

【讨论】:

    【解决方案2】:

    您需要像这样在表上进行自联接:

    select 
      t.date, 
      t.id,
      t.value - tt.value diff
    from t1 t inner join t1 tt
    on tt.id = t.id
    and tt.date = (select max(date) from t1 where date < t.date)
    

    也许inner join 可以更改为left join 以涵盖每个id 没有前一行的情况。
    请参阅demo
    结果:

    | date                | id  | diff |
    | ------------------- | --- | ---- |
    | 2019-02-28 00:00:00 | 1   | 33   |
    | 2019-02-28 00:00:00 | 2   | 32   |
    | 2019-02-28 00:00:00 | 3   | 22   |
    

    【讨论】:

    • 谢谢.. 这看起来不错而且有道理.. 但它似乎很慢.. 对于 100K+ 记录的表 - 这需要几分钟.. 有没有办法优化查询?
    猜你喜欢
    • 1970-01-01
    • 2019-05-22
    • 1970-01-01
    • 1970-01-01
    • 2018-06-27
    • 1970-01-01
    • 2020-06-21
    • 2020-11-10
    • 1970-01-01
    相关资源
    最近更新 更多