每个月的最高和最低销量

时间:2011-03-25 17:05:41

标签: 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

我想要每个月的第一个和最后一个(每月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

我认为哪种方式很慢:

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 ... )

5 个答案:

答案 0 :(得分: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  

答案 1 :(得分:3)

将在SQl Server 2000及更高版本上运行的示例

CREATE TABLE #temp(sale_id INT,    sale_date datetime)

INSERT #temp VALUES(      1 ,     '1/5/2010')
INSERT #temp VALUES(      2 ,     '1/8/2010')
INSERT #temp VALUES(      3 ,     '1/16/2010')
INSERT #temp VALUES(      4 ,     '1/28/2010')
INSERT #temp VALUES(      5 ,     '2/2/2010')
INSERT #temp VALUES(      6 ,     '2/21/2010')
 INSERT #temp VALUES(     7 ,     '2/28/2010')
 INSERT #temp VALUES(     8  ,    '3/3/2010')


 SELECT t.* FROM #temp t
 JOIN(
 SELECT MIN(sale_date) AS MinDAte, MAX(sale_date) AS MaxDate
FROM #temp
GROUP BY YEAR(sale_date), MONTH(sale_date)) x ON t.sale_date = x.MaxDate
OR t.sale_date = x.MinDAte

2005年以及......对Martin的代码进行一点修改(看看where子句)

WITH T
     AS (SELECT *,
                ROW_NUMBER() OVER (PARTITION BY Year(sale_date), MONTH(sale_date)
                ORDER BY sale_date)  RN,
                ROW_NUMBER() OVER (PARTITION BY Year(sale_date), MONTH(sale_date)
                ORDER BY sale_date DESC) RN2
         FROM   #temp)
SELECT sale_id,
       sale_date
FROM   T
WHERE  1 IN(RN ,RN2)

答案 2 :(得分:2)

select sale_ID, sale_date
from table inner join (
    select 
        datepart(yyyy,sale_Date) as yr,
        datepart(mm,sale_Date) as month, 
        min(sale_date) as min_date, 
        max(sale_date) as max_date
    from table
    group by
        datepart(yyyy,sale_Date),
        datepart(mm,saleDate)
) mx 
where sale_date = min_date or sale_date = max_date

答案 3 :(得分:0)

我将把调试留给你(因为我没有方便的sql server副本),但我想你正在寻找类似的东西:

select min(_date) AS minDate, max(_date) as maxDate, _month, _year FROM (
  select 
  datepart(date,sale_date) AS _date,
  datepart(month,sale_date) AS _month,
  datepart(year,sale_date) AS _year,
  FROM sales -- or whatever you have named your table
)
GROUP BY _month, _year
ORDER BY _month,_year

答案 4 :(得分:0)

您可以使用“联合所有选项”或“使用以下脚本”来执行此操作。

但是当你需要order by子句查询时,Union不会工作。

SELECT *
FROM Sales
WHERE SalesID IN 
(
SELECT TOP 1 SalesID
FROM Sales
ORDER BY SaleslID
)
OR
SalesID IN 
(
SELECT TOP 1 SalesID
FROM Sales
ORDER BY SalesID DESC
)GO