【问题标题】:How to convert 5min timestamp intervals to 1min intervals in SQL keeping the other information?如何在保留其他信息的 SQL 中将 5 分钟时间戳间隔转换为 1 分钟间隔?
【发布时间】:2019-02-05 23:25:23
【问题描述】:

我看到一两个话题提出了相反的问题(将 1 分钟时间戳转换为 5 分钟或其他时间戳间隔)。但我完全不明白编写这个的想法。

这是我的输入表:

timestamp     Food      Beverage
15:00:00      Pizza      Coke
15:05:00      Burger     Coke
15:10:00      Hotdog     Pepsi
   …             …        …

这就是我想要的输出:

timestamp   Food    Beverage
 15:00:00   Pizza   Coke
 15:01:00   Pizza   Coke
 15:02:00   Pizza   Coke
 15:03:00   Pizza   Coke
 15:04:00   Pizza   Coke
 15:05:00   Burger  Coke
 15:06:00   Burger  Coke
 15:07:00   Burger  Coke
 15:08:00   Burger  Coke
 15:09:00   Burger  Coke
 15:10:00   Hotdog  Pepsi
 15:11:00   Hotdog  Pepsi
    …         …       …

提前致谢!

【问题讨论】:

    标签: sql sql-server timestamp resolution intervals


    【解决方案1】:

    最简单的方法是使用cross join

    select dateadd(minute, v.m, timestamp) as timestamp,
           food, beverage
    from t cross join
         (values (0), (1), (2), (3), (4)) v(m);
    

    您也可以使用明确的select/union all

    select dateadd(minute, v.m, timestamp) as timestamp,
           food, beverage
    from t cross join
         (select 0 as m union all select 1 union all select 2 union all select 3 union all select 4
         ) v(m);
    

    【讨论】:

    • 如果您事先知道所需的行数,我喜欢使用值部分即时生成行。我不知道你能做到这一点。我花了一段时间才弄清楚 v(m) 符号。是否可以有多个列?
    • @Earl。 . .是的。 VALUES() 行构造函数非常有用。
    • 我不知道为什么我不能在 Microsoft SQL Server 中运行它。它说 - '(' 附近的语法不正确。
    • @zhivab 。 . .我认为表值构造函数自 2008 版以来一直在 SQL Server 中。
    • 我认为这是价值观的问题,因为第二种方法效果很好。谢谢!
    【解决方案2】:

    您可以使用 DATEADD。参数输入N表示分钟。

    ROW_NUMBER 将增加每行的时间戳。

    DECLARE @interval varchar(10) = 5
    
    DROP TABLE IF EXISTS #data
    
    SELECT timestamp='15:00:00',Food='Pizza',Beverage='Coke'
    INTO #data
    UNION ALL SELECT timestamp='15:05:00',Food='Burger',Beverage='Coke'
    UNION ALL SELECT timestamp='15:10:00',Food='Pizza',Beverage='Pepsi'
    
    DROP TABLE IF EXISTS #TAB 
    CREATE TABLE #TAB (id int)
    
    EXEC ('INSERT INTO #TAB
    SELECT TOP '+@interval+ ' ROW_NUMBER() OVER(ORDER BY name) FROM sys.columns')
    
    SELECT timestamp=CAST(DATEADD(n,ROW_NUMBER() OVER (PARTITION BY timestamp,food,beverage ORDER BY Food),timestamp) as time) , Food,Beverage
    FROM #data
    CROSS JOIN #TAB
    ORDER BY 1
    

    输出将是:

    +------------------+--------+----------+
    |    timestamp     |  Food  | Beverage |
    +------------------+--------+----------+
    | 15:01:00.0000000 | Pizza  | Coke     |
    | 15:02:00.0000000 | Pizza  | Coke     |
    | 15:03:00.0000000 | Pizza  | Coke     |
    | 15:04:00.0000000 | Pizza  | Coke     |
    | 15:05:00.0000000 | Pizza  | Coke     |
    | 15:06:00.0000000 | Burger | Coke     |
    | 15:07:00.0000000 | Burger | Coke     |
    | 15:08:00.0000000 | Burger | Coke     |
    | 15:09:00.0000000 | Burger | Coke     |
    | 15:10:00.0000000 | Burger | Coke     |
    | 15:11:00.0000000 | Pizza  | Pepsi    |
    | 15:12:00.0000000 | Pizza  | Pepsi    |
    | 15:13:00.0000000 | Pizza  | Pepsi    |
    | 15:14:00.0000000 | Pizza  | Pepsi    |
    | 15:15:00.0000000 | Pizza  | Pepsi    |
    +------------------+--------+----------+
    

    【讨论】:

      猜你喜欢
      • 2018-05-15
      • 2013-06-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-25
      • 1970-01-01
      相关资源
      最近更新 更多