SQL в сумме за неделю или год - PullRequest
0 голосов
/ 19 июня 2020

У меня есть запрос SQL, который выглядит примерно так:

select  
    DATEPART (week, pos_date) as weeknr,
      Sum(redeem_count)* 100.0/Sum(issue_count) as incent_redemption_rate,
      pos_date
from incent_summary
group by pos_date
order by pos_date

Я получаю следующий результат

weeknr  incent_redemption_rate  pos_date
20  13.356164383561 2020-05-10 00:00:00.000
20  8.990536277602  2020-05-11 00:00:00.000
20  9.615384615384  2020-05-12 00:00:00.000
20  12.917271407837 2020-05-13 00:00:00.000
20  11.447811447811 2020-05-14 00:00:00.000
20  13.773314203730 2020-05-15 00:00:00.000
20  10.798650168728 2020-05-16 00:00:00.000
21  9.164420485175  2020-05-17 00:00:00.000
21  12.170087976539 2020-05-18 00:00:00.000
21  12.000000000000 2020-05-19 00:00:00.000
21  12.932330827067 2020-05-20 00:00:00.000
21  13.464447806354 2020-05-21 00:00:00.000
21  11.248073959938 2020-05-22 00:00:00.000
21  13.868613138686 2020-05-23 00:00:00.000
22  16.559485530546 2020-05-24 00:00:00.000
22  12.602739726027 2020-05-25 00:00:00.000
22  11.559888579387 2020-05-26 00:00:00.000
22  11.176470588235 2020-05-27 00:00:00.000

На самом деле я собираюсь агрегировать incent_redemption_rate по неделям , поэтому мне нужна только одна запись для недели номер 20, а не несколько, на самом деле дата начала 20-й недели.

Ответы [ 2 ]

1 голос
/ 19 июня 2020

Чтобы получать данные еженедельно, просто измените свой запрос на группировку по weeknr (используя его формулу, поскольку вы не можете группировать по псевдониму столбца) и возьмите MIN из pos_date, чтобы получить первый день недели:

SELECT
      DATEPART (week, pos_date) as weeknr,
      SUM(redeem_count)* 100.0/SUM(issue_count) AS incent_redemption_rate,
      MIN(pos_date)
FROM incent_summary
GROUP BY DATEPART (week, pos_date)
ORDER BY DATEPART (week, pos_date)
1 голос
/ 19 июня 2020

Я думаю, вам нужна недельная начальная скорость, а затем указать дату начала недели, то есть понедельник. Один из способов сделать это - получить еженедельную начальную скорость для каждой недели, как показано ниже, а затем объединить ее с основной таблицей, чтобы получить дату позиции.

SELECT pos_date,wkly_rate.weeknr, wkly_rate.incent_redemption_rate
FROM incent_summary ins
JOIN (SELECT DATEPART(week, pos_date) as weeknr,
         SUM(redeem_count)* 100.0/Sum(issue_count) as incent_redemption_rate
      FROM incent_summary
      GROUP BY DATEPART(week, pos_date) ) wkly_rate ON wkly_rate.weeknr = DATEPART(week, ins.pos_date)
WHERE DATENAME(WEEKDAY,A.pos_date) = 'Monday'

Однако в своем запросе вы делаете то, что вы получить начальную скорость для каждого дня вместо недели, а затем вы можете просто получить для одного дня, то есть понедельника, используя следующий запрос.

SELECT * 
FROM (SELECT 
        DATEPART(week, pos_date) as weeknr,
        SUM(redeem_count)* 100.0/Sum(issue_count) as incent_redemption_rate,
        pos_date
      FROM incent_summary
      GROUP BY pos_date
 ) A
 WHERE DATENAME(WEEKDAY,A.pos_date) = 'Monday'
 ORDER BY pos_date
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...