首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从表的不同记录中选择最小值

从表的不同记录中选择最小值
EN

Stack Overflow用户
提问于 2017-10-09 18:12:54
回答 2查看 54关注 0票数 0

假设我有一个查询,在这个查询中,我每天计数事件的数量:

代码语言:javascript
复制
**Date**        **NumberOfEvents**
2017-11-1       7
2017-11-2       11
2017-11-3       3
...
2017-11-8       24
2017-11-9       6
2017-11-10      10
2017-11-11      9
...
2017-11-22      22
2017-11-23      11
2017-11-24      14
2017-11-25      17
...      
2017-11-28      16
2017-11-29      21
2017-11-30      6
...

那么假设我定义了一个变量@StartingDay ='2017-11-3'

我想得到一个查询,其中包含@StartingDay之后4周内同一周+-1天的最小值,p.ex:

代码语言:javascript
复制
**Period**                   **DateWithMin**   **MinNumberOfEvents**
2017-11-09 To 2017-11-11     2017-11-9         6
2017-11-16 To 2017-11-18     2017-11-17        8
2017-11-23 To 2017-11-25     2017-11-23        11
2017-11-30 To 2017-12-02     2017-11-30        6

我相信我必须通过不同的周期来寻找最小值,但是我无法找到一个循环的方法。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-10-09 18:27:28

另一种方法是使用递归的CTE生成FromTo日期,将Row_Number()应用于结果以找到每个分组的Min,并只选择这些结果:

代码语言:javascript
复制
Declare @StartingDay    Date = '2017-11-03',
        @NumWeeks       Int = 4

;With Dates As
(
    Select  DateFrom    = DateAdd(Day, -1, DateAdd(Week, 1, @StartingDay)),
            DateTo      = DateAdd(Day, 1, DateAdd(Week, 1, @StartingDay))
    Union All
    Select  DateFrom    = DateAdd(Week, 1, DateFrom),
            DateTo      = DateAdd(Week, 1, DateTo)  
    From    Dates
    Where   DateTo < DateAdd(Day, 1, DateAdd(Week, @NumWeeks, @StartingDay))
), Results As
(
    Select  PeriodFrom      = D.DateFrom,
            PeriodTo        = D.DateTo,
            NumberOfEvents  = Y.NumberOfEvents,
            RN              = Row_Number() Over (Partition By D.DateFrom, D.DateTo 
                                                 Order By Y.NumberOfEvents),
            Date            = Y.Date
    From    YourTable   Y
    Join    Dates       D   On  Y.Date Between D.DateFrom And D.DateTo
)
Select  PeriodFrom, 
        PeriodTo, 
        DateWithMin         = Date, 
        MinNumberOfEvents   = NumberOfEvents
From    Results
Where   RN = 1
票数 2
EN

Stack Overflow用户

发布于 2017-10-09 18:20:58

您可以使用模块化和日期算法来获取时间段和组:

代码语言:javascript
复制
select min(date), max(date), min(NumberOfEvents)
from t
where (datediff(day, @startingday, date) % 7) in (0, 1, 6) and
      date > dateadd(day, 1, @startingday) and
      date <= dateadd(day, 4 * 7 + 1, @startingday)
group by (datediff(day, @startingday, date) + 1) / 7;

获取最小事件的日期更麻烦。以下是一种方法:

代码语言:javascript
复制
select min(date), max(date), min(NumberOfEvents),
       max(case when seqnum = 1 then date end) as date_at_min
from (select t.*, v.grp,
             row_number() over (partition by grp order by numberofevents) as seqnum
      from t cross apply
           (values ((datediff(day, @startingday, date) + 1) / 7)) v(grp)
     ) t
where (datediff(day, @startingday, date) % 7) in (0, 1, 6) and
      date > dateadd(day, 1, @startingday) and
      date <= dateadd(day, 4 * 7 + 1, @startingday)
group by grp;
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46652592

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档