如果我有以下数据:
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 ... )
答案 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