sql server获取近两年每周下单量TOP20的城市

业务需求:
  • 近两年按周统计每周每个城市的下单量
  • 根据订单量统计每周下单量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
实现逻辑:
  1. 根据上篇博文对近两年的时间按周进行分组;
  2. 根据分组计算每周的每个城市的下单量;
  3. 利用rowNum函数根据year,weekCount分组,按照下单量降序排序;
  4. 获取Top20的城市及其下单量数据;
数据截图如下:

sql server获取近两年每周下单量TOP20的城市_第1张图片

你可能感兴趣的:(SQL,Server)