2011-03-25 73 views
3

如果我有這樣的數據:頂部和底部的銷售每月

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

如果你投了票請說爲什麼:) – 2011-03-25 17:13:28

回答

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 
+0

這是相當漂亮,我的好先生! – DForck42 2011-03-25 17:23:39

+2

你也可以做'WHERE 1 IN(RN,RN2)'作爲快捷方式 – SQLMenace 2011-03-25 17:24:16

+0

ELEGANT解決方案,贊! – WhoIsNinja 2011-03-25 17:24:31

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 
+0

如果你有多年?輸出中的ID在哪裏? – SQLMenace 2011-03-25 17:14:51

+0

添加年份以選擇條款 – Beth 2011-03-25 17:16:53

+0

其中是sale_id? – SQLMenace 2011-03-25 17:17:30

0

我將離開調試你(因爲我沒有SQL服務器方便的複印件),但我想你正在尋找的東西,如:

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 
+0

sale_id在哪裏? – SQLMenace 2011-03-25 17:17:07

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 

for 2005 and up ..對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) 
0

您可以使用Union All Options或Use following Script來執行此操作。

但是,當你需要通過子句給你查詢命令時,聯盟不會工作。

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