使用sql根据日期差异选择记录

Posted

技术标签:

【中文标题】使用sql根据日期差异选择记录【英文标题】:using sql to select records based on date differences 【发布时间】:2013-05-09 09:08:01 【问题描述】:

我管理一个系统,记录其库存商品价格和数量的变化。

表格如下所示:

STOCK(ID, DATE, QUANTITY, PRICE)

(1, 2013.01.07 00:00, 9, 6)
(1, 2013.01.02 00:00, 9, 5)
(1, 2013.01.01 00:00, 10, 5)
(2, 2013.01.07 22:00, 20, 10)
(2, 2013.01.07 00:00, 24, 10)
(3, 2013.01.02 00:00, 9, 5)
(3, 2013.01.01 00:00, 10, 5)

返回 1 天期限内更改的查询应返回项目的最新历史记录信息以及与其相差最多 1 天的历史记录信息(如果没有,则返回自身):

STOCK(ID, DATE_BEFORE, DATE_AFTER, QUANTITY_BEFORE, QUANTITY_AFTER, PRICE_BEFORE, PRICE_AFTER)
(1, 2013.01.07 00:00, 2013.01.07 00:00, 9, 9, 6, 6)
(2, 2013.01.07 00:00, 2013.01.07 22:00, 24, 20, 10, 10)
(3, 2013.01.01 00:00, 2013.01.02 00:00, 10, 9, 5, 5)

返回 1 周内更改的查询应返回项目的最新历史记录信息以及与其相差最多 7 天的历史记录信息(如果没有,则返回自身):

STOCK(ID, DATE_BEFORE, DATE_AFTER, QUANTITY_BEFORE, QUANTITY_AFTER, PRICE_BEFORE, PRICE_AFTER)
(1, 2013.01.01 00:00, 2013.01.07 00:00, 10, 9, 5, 6)
(2, 2013.01.07 00:00, 2013.01.07 22:00, 24, 20, 10, 10)
(3, 2013.01.01 00:00, 2013.01.02 00:00, 10, 9, 5, 5)

我希望这足够清楚,因为我知道这不是一个容易的话题。

期待听到你们的声音。

提前致谢,

H

【问题讨论】:

您使用的是哪个数据库,到目前为止您尝试过什么? 什么是表唯一键?对于“一天”结果,您似乎缺少 ID=1 的第 2 行和第 3 行的输出行 @Ian Kenney 你好。我正在使用超音速 2.2.9 @gbn 关于PK,很抱歉我忘记了。有一个顺序,示例记录将是数字 1 到 7 的键。结果没有丢失。该查询仅考虑给定 STOCK.ID 的最新记录以获取 AFTER_* 信息。 @Ian Kenney 到目前为止,我一直在尝试使用子查询来做到这一点,但到目前为止还没有提出任何有用的东西,我们正在讨论页面长查询...... 【参考方案1】:

免责声明:我对超音速sql方言不熟悉。

以下内容可能会帮助你到达你需要的地方,它似乎在mysql上得到了你想要的。

select subq.*, 
  st_before.quantity QUANTITY_BEFORE, 
  st_after.quantity QUANTITY_AFTER,  
  st_before.price PRICE_BEFORE,
  st_after.price PRICE_AFTER
from ( 
  select 
    max_id stock_id, 
    date_before,
    date_after 
  from
  (
    SELECT id max_id,max(date) date_after
    FROM STOCK
    GROUP BY ID 
  ) mx
  join 
  (  
    SELECT stock.id min_id,min(stock.date) date_before
    FROM STOCK 
    join (
       SELECT id,max(date) date_after
       FROM STOCK
       GROUP BY ID 
    ) mmx
    on stock.id = mmx.id
    and datediff(mmx.date_after, stock.date) < 1
    GROUP BY stock.ID 
  ) mn 
  on  mx.max_id = mn.min_id 
  ) subq 
  join stock st_before 
  on st_before.id = subq.stock_id 
  and st_before.date = subq.date_before 
  join stock st_after 
  on st_after.id = subq.stock_id 
  and st_after.date = subq.date_after 
  order by stock_id
;

sql fiddle

【讨论】:

以上是关于使用sql根据日期差异选择记录的主要内容,如果未能解决你的问题,请参考以下文章

SQL Select 查询以选择日期之间的数据,其中从日期月份高于日期月份和年份差异>1

SQL:根据最近的日期选择一个字段中的值是唯一的记录

从 MySQL 中根据日期选择记录

选择日期+3天,不包括周末和节假日

从日期中选择特定记录的 SQL 查询

T-SQL 根据与其他记录的日期和时间差过滤记录