【问题标题】:select datetime closest to a specified value for every day in a year为一年中的每一天选择最接近指定值的日期时间
【发布时间】:2017-10-01 17:45:18
【问题描述】:

我有 2 个简单的表定义为:

CREATE TABLE [dbo].[shop](
    [id] [uniqueidentifier] NOT NULL,
    [name] [ntext] NOT NULL,
    [brand] [ntext] NULL
)
CREATE TABLE [dbo].[shop_history](
    [id] [int] NOT NULL,
    [shopid] [uniqueidentifier] NOT NULL,     (references shop.id)
    [totalstockval] [int] NOT NULL,
    [date] [datetime2](0) NOT NULL
)

有数据:

**dbo.shop**
id    | name    | brand
--------------------------
    1 |  Bow Rd | Tesco
    2 | Wren Rd | Tesco
    3 | Skye Rd | Safeway

**dbo.shop_history**
id    | shopid  | totalstockval  | date
----------------------------------------------
  997 |       1 |       19923031 | 2017-02-01 08:00
  998 |       1 |       19323322 | 2017-02-01 08:30
  999 |       1 |       19283873 | 2017-02-01 09:45
 1000 |       2 |       14949321 | 2017-02-01 07:00
 1001 |       2 |       12312312 | 2017-02-01 09:30
 1002 |       3 |       12232344 | 2017-01-31 23:45
 1003 |       3 |       12999222 | 2017-02-01 09:45

我有一整年的类似数据。我想查询数据以找到每天 09:00 之前的最新股票价值,即使那发生在前一天。

我试图实现的结果集如下所示:

shop.id |    name |   brand | totalstockval |              date
---------------------------------------------------------------
      1 |  Bow Rd |   Tesco |      19323322 |  2017-02-01 08:30
      2 | Wren Rd |   Tesco |      14949321 |  2017-02-01 07:00
      3 | Skye Rd | Safeway |      12232344 |  2017-01-31 23:45

在一年中的每一天重复。如果某一天没有值行,请使用最新的可用值。

我感觉我需要一个计数表,其中包含我想要价格的每个日期(或日期时间),但我不确定查询。我怎样才能获得类似于上述示例的结果集?

【问题讨论】:

  • 用您正在使用的数据库标记您的问题。
  • 谢谢,我已经标记了 SQL Server

标签: sql sql-server date datetime select


【解决方案1】:

这是一个棘手的问题。您想要每天上午 9:00 结束的每个商店的最新 shop_history 记录。一种方法是减去 9 小时并根据结果日期进行计算:

select sh.*
from (select sh.*,
             row_number() over (partition by shopid,
                                             cast(dateadd(hour, -9, date) as date)
                                order by date desc
                               ) as seqnum
      from shop_history sh
     ) sh
where seqnum = 1

【讨论】:

    【解决方案2】:

    你可能需要一个最大日期的子选择

      select t.shopid, b.name, b.brand, t.max_date, a.totalstockvale 
      from  shop_history a 
      inner join (
        select  shopid,  max(date)  max_date
        from shop_history a 
        where time(date) < '09:00'
        group by a.shopid ) t on a.shopid = t.shopid and a.date = t.date
      inner join shop on a.shopid = b.shopid
    

    【讨论】:

    • 这适用于单日。但我有一整年的数据,所以需要早上 9 点的每日库存值。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-06
    相关资源
    最近更新 更多