业务需求:
- 近两年按周统计每周每个城市的下单量
- 根据订单量统计每周下单量TOP20的城市
- 每周四作为一周的第一天
实现SQL如下:
SET DATEFIRST 3
select * from
(select *,
ROW_NUMBER() over(partition by 年份,weekCount order by orderscount desc) rowNum
from (select Year(dd.StartDate) as 年份,dd.weekCount,
pu_city_airline,sum(orderscount) orderscount
from Repl_DJ_PerDay_Summary(nolock) ssum
left join (SELECT DISTINCT
weekCount,
StartDate,
CONVERT( CHAR(10),
CASE
WHEN ff.weekCount = 53 THEN
DATEADD(DAY, 7, ff.StartDate)
ELSE
ff.EndDate
END,
120
) EndDate,
CONVERT(CHAR(10), DATEADD(WEEK, -1, StartDate), 120) StartDateLastWeek,
CONVERT(CHAR(10), DATEADD(yy, -1, StartDate), 120) AS StartDateLastYear,
CONVERT(CHAR(10), DATEADD(yy, -1, CONVERT( CHAR(10),
CASE
WHEN ff.weekCount = 53 THEN
DATEADD(DAY, 7, ff.StartDate)
ELSE
ff.EndDate
END,
120
)), 120) AS EndDateLastYear
FROM
(
SELECT DATEPART(WEEK, Date) AS weekCount,
MIN(Date) StartDate,
CONVERT(CHAR(10),
DATEADD( DAY,
(
SELECT 7 - (SELECT DATEPART(WEEKDAY, MIN(Date)))
),
MIN(Date)
),
120
) AS EndDate
FROM
(
SELECT Date
FROM Repl_DJ_PerDay_Summary
WHERE YEAR(Date) >= YEAR(DATEADD(yy, -1, GETDATE()))
GROUP BY Date
) ss
GROUP BY DATEPART(WEEK, Date)
UNION ALL
SELECT weekCount,
CONVERT(CHAR(10), DATEADD(yy, 1, StartDate), 120) StartDate,
CONVERT(CHAR(10), DATEADD(yy, 1, EndDate), 120) AS EndDate
FROM
(
SELECT DATEPART(WEEK, Date) AS weekCount,
MIN(Date) StartDate,
CONVERT(CHAR(10),
DATEADD( DAY,
(
SELECT 7 - (SELECT DATEPART(WEEKDAY, MIN(Date)))
),
MIN(Date)
),
120
) AS EndDate
FROM
(
SELECT Date
FROM Repl_DJ_PerDay_Summary
WHERE YEAR(Date) >= YEAR(DATEADD(yy, -1, GETDATE()))
GROUP BY Date
) ss
GROUP BY DATEPART(WEEK, Date)
) tt
) ff
WHERE weekCount <> 1) dd on ssum.Date >= dd.StartDate and ssum.Date <= dd.EndDate
where dd.StartDateLastYear is not null and dd.EndDateLastYear is not null
group by dd.StartDate,dd.EndDate,dd.weekCount,pu_city_airline)
rowNumberDate) baseData where rowNum < 21
实现逻辑:
- 根据上篇博文对近两年的时间按周进行分组;
- 根据分组计算每周的每个城市的下单量;
- 利用rowNum函数根据year,weekCount分组,按照下单量降序排序;
- 获取Top20的城市及其下单量数据;
数据截图如下:
