Как группировать каждые 3 одинаковые записи на основе условия where в SQL - PullRequest
0 голосов
/ 08 июня 2018

Я хочу группировать каждые 3 записи на основе условия where Итак, я пытаюсь выполнить следующие шаги ..

Это моя таблица

This is My Table

Это мой запрос.

 WITH T AS (
    SELECT RANK() OVER (ORDER BY Sno) Rank, Sno ,id,Dt, val AS val
    FROM p
    )
    SELECT (Rank-1) / 3 GroupID, id,Dt, SUM(val) AS val ,count(Sno) as Record
    FROM T
    GROUP BY  ((Rank-1) / 3),id,Dt
    order By  GroupID

Тогда я следую за Результатом.

enter image description here

Тогда как группировать эти записи с помощью Sum(Val) ...

Ответы [ 3 ]

0 голосов
/ 08 июня 2018

Группировка по идентификатору не будет работать.Вы можете взять мин или макс.

Пример:

 WITH T AS (
    SELECT RANK() OVER (ORDER BY Sno) Rank, Sno ,id,Dt, val AS val
    FROM p
    )
    SELECT (Rank-1) / 3 GroupID, MAX(id),Dt, SUM(val) AS val ,count(Sno) as Record
    FROM T
    GROUP BY  ((Rank-1) / 3),Dt--Remove id
    order By  GroupID

Я создал пример здесь:

http://rextester.com/TCJYIQ73230

0 голосов
/ 08 июня 2018

Я бы сделал это как cumulative sum, если я правильно понял:

select GroupID, dt, sum(val) as val, count(*) as record
from (select *, 
            sum(case when id = 1 then 1 else 0 end) over (order by sno)-1 as GroupID
      from p
     ) p
group by GroupID, dt;

Честно говоря, я понятия не имею о id, как указано в о / п.

0 голосов
/ 08 июня 2018

Вам нужно решить, как агрегировать id и Dt - при условии, что вы просто хотите затем min

WITH T AS (
SELECT RANK() OVER (ORDER BY Sno) Rank, Sno ,id,Dt, val AS val
FROM p
)
SELECT (Rank-1) / 3 GroupID, MIN(id) as id, MIN(Dt) as Dt, SUM(val) AS val ,count(Sno) as Record
FROM T
GROUP BY  ((Rank-1) / 3)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...