每个月的最高和最低销量

Who*_*nja 3 sql sql-server

如果我有以下数据:

sale_id     sale_date
      1      1/5/2010
      2      1/8/2010
      3      1/16/2010
      4      1/28/2010
      5      2/2/2010
      6      2/21/2010
      7      2/29/2010
      8      3/3/2010
Run Code Online (Sandbox Code Playgroud)

我想要每个月的第一个和最后一个(每月2个或更少的记录):

期望的输出:

sale_id     sale_date
      1      1/5/2010
      4      1/28/2010
      5      2/2/2010
      7      2/29/2010
      8      3/3/2010
Run Code Online (Sandbox Code Playgroud)

我认为缓慢的一种方法是:

select * from table o
where sale_date in (select max(sale_date) from table where datepart(month+year of sale_date) = datepart(month+year of o.sale_date), select min(sale_date) from table where ... )
Run Code Online (Sandbox Code Playgroud)

Mar*_*ith 6

WITH T
     AS (SELECT sale_id,
                sale_date,
                ROW_NUMBER() OVER (PARTITION BY Year(sale_date), MONTH(sale_date)
                ORDER BY sale_date ASC)  RN,
                ROW_NUMBER() OVER (PARTITION BY Year(sale_date), MONTH(sale_date)
                ORDER BY sale_date DESC) RN2
         FROM   YourTable)
SELECT sale_id,
       sale_date
FROM   T
WHERE  RN = 1
        OR RN2 = 1  
Run Code Online (Sandbox Code Playgroud)

  • 你也可以做`WHERE 1 IN(RN,RN2)`作为捷径 (2认同)