Группировка строк запроса вместе - PullRequest
0 голосов
/ 09 июня 2018

Мне нужно сгруппировать строки запроса вместе, чтобы создать бины (группы) строк.Диапазон группы должен динамически передаваться в запрос (например, из переменной @b = [4]).

Я начал с использования функции row_number () для последовательного нумерации строк.Но я должен понять, как идти дальше.Вот мой сценарий:

select date, measure, row_number() over (order by date,measure)
from dwh.overview_all_data

И это результат моего запроса:

date  measure  row_number
1998-01-11  AOX  1
1998-01-11  Ammonium  2
1998-01-11  Arsenic  3
1998-01-11  Atrazine  4
1998-01-11  Biochemical Oxygen  5
1998-01-11  Cadmium  6
1998-01-11  Calcium  7
1998-01-11  Cesium  8
1998-01-11  Chemical Oxygen Demand (Cr)  9
1998-01-11  Chemical Oxygen Demand (Mn)  10
1998-01-11  Chlorides  11
1998-01-11  Chromium  12
1998-01-11  Copper  13
1998-01-11  Dissolved oxygen  14
1998-01-11  Fecal coliforms  15
1998-01-11  Iron  16

Допустим, я хочу, чтобы эти 16 строк были в 4 ячейках (b = [4]), Мне также нужно определить дату начала и окончания каждого бина (группы).т.е. результат будет выглядеть так:

date  measure  row_number  bin, startdate  enddate
1998-01-11  AOX  1  1  1998-01-11  1998-01-11
1998-01-11  Ammonium  2  1  1998-01-11  1998-01-11
1998-01-11  Arsenic  3  1  1998-01-11  1998-01-11
1998-01-11  Atrazine  4  1  1998-01-11  1998-01-11
1998-01-11  Biochemical Oxygen  5  2  1998-01-11  1998-01-20
1998-01-15  Cadmium  6  2  1998-01-11  1998-01-20
1998-01-15  Calcium  7  2  1998-01-11  1998-01-20
1998-01-20  Cesium  8  2  1998-01-11  1998-01-20
1999-01-21  Chemical Oxygen Demand (Cr)  9  3  1999-01-21  2005-01-22
1999-01-22  Chemical Oxygen Demand (Mn)  10  3  1999-01-21  2005-01-22
1999-01-22  Chlorides  11  3  1999-01-21  2005-01-22
2005-01-22  Chromium  12  3  1999-01-21  2005-01-22
2005-02-01  Copper  13  4  2005-02-01  2007-04-01
2005-02-11  Dissolved oxygen  14  4  2005-02-01  2007-04-01
2005-03-15  Fecal coliforms  15  4  2005-02-01  2007-04-01
2007-04-01  Iron  16  4  2005-02-01  2007-04-01

1 Ответ

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

Я мог бы выяснить это:

Select t1.measure, t1.bin, Min(t1.date) startDate, Max(t1.date) EndDate, count(*)
from(
select date, measure, row_number() over (order by date,measure), floor(((row_number() over (order by date,measure))-1) /88) as bin
from dwh.overview_all_data
  order by date, measure
) t1
group by t1.measure, t1.bin
order by t1.measure, t1.bin, startDate, EndDate

Число "88" в столбце корзины рассчитывается отдельно следующим образом:

select 8819 / 100 -- = 88

"100" - это числоящики (группы), которые мы хотим.Он задается пользователем.

«8819» - это число строк внутреннего оператора, и его можно вернуть с помощью этого сценария:

select count(*) from
    (
      select date, measure, row_number() over (order by date, measure )
      from dwh.overview_all_data
      where date between '1998-01-01' and '2000-01-01'
      order by date, measure
    ) t

, разделив эти два числа, которые мыполучить количество строк в каждой ячейке.

...