【问题标题】:Use min function without grouping使用 min 函数而不分组
【发布时间】:2021-07-24 01:15:33
【问题描述】:

如何在没有group by 的情况下检索日期的min

declare @table table 
(
    SaleDate date
)
insert into @table
select '7/8/2021' union
select '7/21/2021'



declare @dimdate table
(
    fulldate date,
    WeekNumberOfYear int
)
insert into @dimdate
select '7/4/2021', 28 union
select '7/5/2021', 28 union
select '7/6/2021', 28 union
select '7/7/2021', 28 union
select '7/8/2021', 28 union
select '7/9/2021', 28 union
select '7/10/2021', 28 union
select '7/11/2021', 29 union
select '7/18/2021', 30 union
select '7/19/2021', 30 union
select '7/20/2021', 30 union
select '7/21/2021', 30 union
select '7/22/2021', 30 union
select '7/23/2021', 30 union
select '7/24/2021', 30


select datepart(week, saledate) 'wk', 
min(fulldate) as 'Beginning_Week' 
from @table t inner join @dimdate d on
datepart(week, saledate) = WeekNumberOfYear
group by datepart(week, saledate), WeekNumberOfYear

如何在没有分组依据的情况下检索与上述相同的结果?

【问题讨论】:

  • 改用窗口聚合。
  • 也可以提供 DimDate 表吗?
  • 抱歉这个问题不好。我已经编辑过了。

标签: tsql


【解决方案1】:

你的意思是这样的吗?

select dt,
(select min(WeekNumberOfYear) from DimDate) as minWeekNumberOfYear
from @table

【讨论】:

    【解决方案2】:

    只需使用窗口聚合:

    SELECT dt,
           MIN(dt) OVER () AS MinDt
    FROM @table;
    

    【讨论】:

      【解决方案3】:

      如果按WeekNumberOfYear分区,可以使用MIN()窗口函数,并在SELECT语句中使用DISTINCT,这样就没有重复了:

      SELECT DISTINCT 
             d.WeekNumberOfYear wk, 
             MIN(fulldate) OVER (PARTITION BY d.WeekNumberOfYear) Beginning_Week 
      FROM @table t INNER JOIN @dimdate d 
      ON DATEPART(week, t.saledate) = d.WeekNumberOfYear;
      

      请参阅demo

      【讨论】:

        猜你喜欢
        • 2014-12-19
        • 1970-01-01
        • 2016-10-31
        • 2020-02-12
        • 1970-01-01
        • 2012-03-09
        • 2022-12-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多