【问题标题】:Select weekly data from date table从日期表中选择每周数据
【发布时间】:2019-04-07 01:24:51
【问题描述】:

我有一个包含日期和其他列的表格。日期均为工作日,节假日和周末除外。我需要从表中选择每周数据(或者每周一的数据,如果周一是节假日,则选择周二的。下一行将是周一的数据,依此类推。

    Example table columns and data:
    Date           Rate    StockQty       
    2018/08/31      22       25 
    2018/09/04      24       25
    2018/09/05      23       24
    2018/09/06      19       21
    2018/09/07      25       22
    2018/09/10      21       21

    I need to select data such that the result will be:

    Date           Rate    StockQty       
    2018/08/31      22       25
    2018/09/04      24       25
    2018/09/10      21       21

每周选择一行。 9/3 是星期一和节假日,所以选择星期二日期,然后选择下周的星期一日期。

我尝试按 DatePart 进行分区,但它整整一周都在运行。

【问题讨论】:

  • 用您正在使用的数据库标记您的问题。众所周知,日期函数依赖于数据库。

标签: sql sql-server


【解决方案1】:
    create table #Date_rate
    (
    date smalldatetime,rate int,stockQty int
    )
    Insert into #Date_rate
    select '2018/08/31',      22 ,      25  union
    select '2018/09/04',      24 ,      25  union
    select '2018/09/05',      23 ,      24  union
    select '2018/09/06',      19 ,      21  union
    select '2018/09/07',      25 ,      22  union
    select '2018/09/10',      21 ,      21

 select 
         a.date
        ,a.rate
        ,a.stockQty
    from(
        select 
             *
            ,dense_rank() over(partition by datepart(WEEK,date) order by datepart(WEEKDAY,date) asc) as SekectedDay
        from  #Date_rate
    ) a where SekectedDay=1

【讨论】:

    【解决方案2】:

    你可以遵循这样的逻辑:

    select t.*
    from (select t.*,
                 row_number() over (partition by extract(year from date), extract(week from date) order by date asc) as seqnum
          from t
         ) t
    where seqnum = 1;
    

    日期函数可能因数据库而异。这使用 ANSI/ISO 标准函数。

    【讨论】:

    • 我正在使用 MS SQL。它没有星期。我可以选择年、月和日。我正在尝试从一系列日期中选择每周一行数据。
    • 在 SQL Server 中,使用DATEPART(WEEK,date)
    • 谢谢,它有效!我只按周分区,添加年份有帮助。谢谢你们两个:)
    【解决方案3】:

    这应该在 SQL Server 中工作:

    SELECT date,Rate,StockQty FROM 
    (SELECT
        date,
        Rate,
        StockQty,
        ROW_NUMBER() OVER(PARTITION BY YEAR(date),DATENAME(WK,Date) ORDER BY day(date))cnt
     FROM
        #temp
     )m
    WHERE
    cnt = 1
    

    【讨论】:

    • 感谢您的评论。我已经选择了上面的答案。对我来说,按年、按周划分是有效的。
    猜你喜欢
    • 2015-05-04
    • 1970-01-01
    • 2017-10-29
    • 1970-01-01
    • 1970-01-01
    • 2021-08-15
    • 1970-01-01
    • 2020-07-18
    • 2016-07-07
    相关资源
    最近更新 更多