Гость
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Как определить/получить диапазон / 25 сообщений из 41, страница 1 из 2
02.06.2016, 11:59
    #39248892
akrush
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как определить/получить диапазон
Добрый день, всем.
Есть такая табличка:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
№п/п		Улица	Код Ул	№дома	Корп		кв.с	кв.по	тар1	тар2
778		Величка С.	25	12		1	1	2,22	2,22
779		Величка С.	25	12		2	2	2,22	2,22
780		Величка С.	25	12		3	3	2,22	2,22
781		Величка С.	25	12		4	4	2,22	2,22
782		Величка С.	25	12		5	5	2,22	2,22
783		Величка С.	25	12		6	6	2,22	2,22
784		Величка С.	25	12		7	7	2,22	2,22
785		Величка С.	25	12		8	8	2,22	2,22
786		Величка С.	25	14		1	1	2,26	2,26
787		Величка С.	25	14		2	2	2,26	2,26
788		Величка С.	25	14		3	3	2,26	2,26
789		Величка С.	25	14		4	4	2,26	2,26
790		Величка С.	25	14		5	5	2,26	2,26
791		Величка С.	25	14		6	6	2,26	2,26
792		Величка С.	25	14		7	7	2,26	2,26
793		Величка С.	25	14		8	8	2,26	2,26
794		Величка С.	25	16		1	1	2,34	2,34
795		Величка С.	25	16		2	2	2,34	2,34
796		Величка С.	25	16		3	3	2,34	2,34
797		Величка С.	25	16		4	4	2,34	2,34
798		Величка С.	25	16		5	5	2,34	2,34
799		Величка С.	25	16		6	6	2,34	2,34
800		Величка С.	25	16		7	7	2,34	2,34
801		Величка С.	25	16		8	8	2,34	2,34
802		Величка С.	25	5		1	1	2,02	2,02
803		Величка С.	25	6		1	1	1,97	1,97
804		Величка С.	25	6		2	2	1,97	1,97
805		Величка С.	25	6		3	3	1,97	1,97
806		Величка С.	25	6		4	4	1,97	1,97
807		Величка С.	25	6		5	5	1,97	1,97
808		Величка С.	25	6		6	6	1,97	1,97
809		Величка С.	25	6		7	7	1,97	1,97
810		Величка С.	25	6		8	8	1,97	1,97
811		Величка С.	25	8		8	8	2,47	2,47
812		Величка С.	25	8	1	1	1	2,47	2,47
813		Величка С.	25	8	1	10	10	2,47	2,47
814		Величка С.	25	8	1	11	11	2,47	2,47


Возможно ли, как-то, запросом получить непрерывный диапазоны квартир с одинаковой стоимостью. Ключевые поля для отбора: Код Ул., №дома, корп. На номер по порядку можно не реагировать, его легко можно изменить ;)
Другими словами получить вот такое:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
№п/п		Улица	Код Ул	№дома	Корп		кв.с	кв.по	тар1	тар2
778		Величка С.	25	12		1	8	2,22	2,22
786		Величка С.	25	14		1	8	2,26	2,26
794		Величка С.	25	16		1	8	2,34	2,34
802		Величка С.	25	5		1	1	2,02	2,02
803		Величка С.	25	6		1	8	1,97	1,97
811		Величка С.	25	8		8	8	2,47	2,47
812		Величка С.	25	8	1	1	1	2,47	2,47
813		Величка С.	25	8	1	10	11	2,47	2,47

...
Рейтинг: 0 / 0
02.06.2016, 12:00
    #39248895
akrush
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как определить/получить диапазон
№дома, код ул. и корп. чуть-чуть сместились
...
Рейтинг: 0 / 0
02.06.2016, 12:02
    #39248902
DarkMaster
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как определить/получить диапазон
akrush,

WHERE ?
...
Рейтинг: 0 / 0
02.06.2016, 12:23
    #39248935
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как определить/получить диапазон
Оконные функции?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
02.06.2016, 12:58
    #39248982
rdb_dev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как определить/получить диапазон
akrush, если непрерывность диапазона квартир относительно ключевых полей где-то прерывается, тогда что надо получить? Максимально большой диапазон?
...
Рейтинг: 0 / 0
02.06.2016, 13:10
    #39249000
akrush
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как определить/получить диапазон
rdb_devakrush, если непрерывность диапазона квартир относительно ключевых полей где-то прерывается, тогда что надо получить? Максимально большой диапазон?
2 диапазона с разрывом
...
Рейтинг: 0 / 0
02.06.2016, 13:13
    #39249006
S.G.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как определить/получить диапазон
akrushДругими словами получить вот такое:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
№п/п		Улица	Код Ул	№дома	Корп		кв.с	кв.по	тар1	тар2
778		Величка С.	25	12		1	8	2,22	2,22
786		Величка С.	25	14		1	8	2,26	2,26
794		Величка С.	25	16		1	8	2,34	2,34
802		Величка С.	25	5		1	1	2,02	2,02
803		Величка С.	25	6		1	8	1,97	1,97
811		Величка С.	25	8		8	8	2,47	2,47
812		Величка С.	25	8	1	1	1	2,47	2,47
813		Величка С.	25	8	1	10	11	2,47	2,47


Вы пока что получаете не диапазон, а начало, минимальный "№п/п" для одинаковых "тар".
...
Рейтинг: 0 / 0
02.06.2016, 13:15
    #39249009
S.G.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как определить/получить диапазон
S.G.akrushДругими словами получить вот такое:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
№п/п		Улица	Код Ул	№дома	Корп		кв.с	кв.по	тар1	тар2
778		Величка С.	25	12		1	8	2,22	2,22
786		Величка С.	25	14		1	8	2,26	2,26
794		Величка С.	25	16		1	8	2,34	2,34
802		Величка С.	25	5		1	1	2,02	2,02
803		Величка С.	25	6		1	8	1,97	1,97
811		Величка С.	25	8		8	8	2,47	2,47
812		Величка С.	25	8	1	1	1	2,47	2,47
813		Величка С.	25	8	1	10	11	2,47	2,47



Вы пока что получаете не диапазон, а начало, минимальный "№п/п" для одинаковых "тар".Вернее, там где вы пишете "надо получить", там у вас не диапазон
...
Рейтинг: 0 / 0
02.06.2016, 13:18
    #39249014
stelvic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как определить/получить диапазон
проще всего это сделать хранимой процедурой или execute block
...
Рейтинг: 0 / 0
02.06.2016, 13:20
    #39249017
S.G.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как определить/получить диапазон
akrushrdb_devakrush, если непрерывность диапазона квартир относительно ключевых полей где-то прерывается, тогда что надо получить? Максимально большой диапазон?
2 диапазона с разрывомих может быть и больше чем два.
в общем виде, для одной стоимости, у вас может получиться что-то вида:
278-280, 299-299, 320-323 и т.д.
Вы все-таки пересмотрите, что именно надо получить.
...
Рейтинг: 0 / 0
02.06.2016, 13:21
    #39249019
Как определить/получить диапазон
akrush,

если не сложно, предоставь данные в удобном для использования виде (через create table / insert или через WITH), ну, чтобы их можно было тупо скопировать в окне браузера, вставить в окно гонялки запросов, нажать кнопку "выполнить" и чтоб оно заработало....
...
Рейтинг: 0 / 0
02.06.2016, 13:25
    #39249024
Как определить/получить диапазон
Добрый Э - Эх,

но вообще - группировка по инварианту группы на разности двух разнооконных ROW_NUMBER-ов
либо, START_OF_GROUP метод на LEAD/LAG + последующий накопительный итог (SUM() OVER(order by))
...
Рейтинг: 0 / 0
02.06.2016, 13:29
    #39249034
rdb_dev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как определить/получить диапазон
akrush, что-то я не наблюдаю explain набора строк - имя источника строк и имена полей.
...
Рейтинг: 0 / 0
02.06.2016, 16:27
    #39249319
akrush
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как определить/получить диапазон
Добрый Э - Эхakrush,

если не сложно, предоставь данные в удобном для использования виде (через create table / insert или через WITH), ну, чтобы их можно было тупо скопировать в окне браузера, вставить в окно гонялки запросов, нажать кнопку "выполнить" и чтоб оно заработало....

Скрипт с инсертами
...
Рейтинг: 0 / 0
03.06.2016, 05:01
    #39249673
Как определить/получить диапазон
akrush,

Если бы поле с номером квартиры было бы числового типа, или хотя бы не содержало буквенные символы, то запрос мог бы иметь примерно такой вид:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
select row_number() over(order by  v_cod, bld, corp, min(flat1)) as nn
     , max(vul_n) as vul_n, v_cod, bld, corp
     , min(flat1) as beg_flat, max(flat1) as end_flat, taryf1
  from (
         select t.*
              , flat1 - row_number()
                              over(partition by v_cod, bld, corp, taryf1 
                                       order by flat1) as grp_id
           from WORK_OPLATA t
       ) v
 group by v_cod, bld, corp, taryf1, grp_id
 order by v_cod, bld, corp, min(flat1)

Но наличие буквенных символов делает неприменимым к полю числовой арифметики.
...
Рейтинг: 0 / 0
03.06.2016, 08:29
    #39249727
akrush
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как определить/получить диапазон
Добрый Э - Эх,

Спасибо, попробую. Этого будет достаточно. Квартиры с буквами можно взять отдельно и добавить в итоговую таблицу.
Сейчас попробую.
...
Рейтинг: 0 / 0
03.06.2016, 09:22
    #39249769
akrush
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как определить/получить диапазон
Добрый Э - Эх,
ibexpert ругается на over(
...
Рейтинг: 0 / 0
03.06.2016, 09:23
    #39249772
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как определить/получить диапазон
akrush,

версия firebird какая? Оконные функции появились в 3.0
...
Рейтинг: 0 / 0
03.06.2016, 09:45
    #39249796
akrush
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как определить/получить диапазон
Симонов Денис,
сори, забыл указать 2,5
...
Рейтинг: 0 / 0
03.06.2016, 10:34
    #39249846
stelvic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как определить/получить диапазон
akrush,

если 2.5 то хранимка или execute block
...
Рейтинг: 0 / 0
03.06.2016, 11:08
    #39249903
Как определить/получить диапазон
akrush,

тогда уже проще при помощи хранимой процедуры делать.
но в целом, запрос мог бы выглядеть как-то так:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
with
  t as 
    (
      select VUL_N, V_COD, BLD, CORP, cast(FLAT1 as integer) as flat1, TARYF1
        from WORK_OPLATA 
       where upper(flat1) = lower(flat1)
         and flat1 not like '%/%'
    )
 , v_beg as
     (
       select * 
         from t t0
        where not exists 
                (
                  select null 
                    from t t1
                   where t1.v_cod = t0.v_cod 
                     and t1.bld = t0.bld
                     and (t1.corp = t0.corp or t1.corp is null and t0.corp is null)
                     and t1.taryf1 = t0.taryf1
                     and t1.flat1 = t0.flat1 - 1
                )
     )
 , v_end as
     (
       select * 
         from t t0
        where not exists 
                (
                  select null 
                    from t t1
                   where t1.v_cod = t0.v_cod 
                     and t1.bld = t0.bld
                     and (t1.corp = t0.corp or t1.corp is null and t0.corp is null)
                     and t1.taryf1 = t0.taryf1
                     and t1.flat1 = t0.flat1 - 1
                )
     )
--
--
select max(v_beg.vul_n) as vul_n, v_beg.v_cod, v_beg.bld, v_beg.corp, v_beg.flat1, min(v_end.flat1) x_flat1, v_beg.taryf1
  from v_beg
  join v_end
    on v_beg.v_cod = v_end.v_cod
   and v_beg.bld = v_end.bld
   and (v_beg.corp = v_end.corp or v_beg.corp is null and v_end.corp is null)
   and v_beg.taryf1 = v_end.taryf1
   and v_beg.flat1 <= v_end.flat1
 group by  v_beg.v_cod, v_beg.bld, v_beg.corp, v_beg.flat1, v_beg.taryf1;

ну и квартиры с нечисловыми символами нужно прикрутить...
...
Рейтинг: 0 / 0
03.06.2016, 11:39
    #39249944
rdb_dev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как определить/получить диапазон
akrush, как считать разрыв номеров квартир более чем на единицу, если поля flat1 и flat2 символьные и могут содержать литеры?
...
Рейтинг: 0 / 0
03.06.2016, 11:51
    #39249960
rdb_dev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как определить/получить диапазон
akrush, если поля flat сделать числовыми, а символьные постфиксы вынести в отдельное поле, то, в общих чертах, процедура выглядит так:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
CREATE OR ALTER PROCEDURE price_ranges
  RETURNS
  (
    price        NUMERIC(8,2),
    street_id    INTEGER,
    bld_num      VARCHAR(10),
    bld_lit      VARCHAR(10),
    flat_from    SMALLINT,
    flat_to      SMALLINT
  )
AS
  DECLARE VARIABLE nextPrice     NUMERIC(8,2) DEFAULT 0;
  DECLARE VARIABLE nextStreetId  INTEGER DEFAULT NULL;
  DECLARE VARIABLE nextFlat      SMALLINT DEFAULT 0;
  DECLARE VARIABLE nextBldNum    VARCHAR(10) DEFAULT '0';
  DECLARE VARIABLE nextBldLit    VARCHAR(10) DEFAULT '';
BEGIN
  FOR
      SELECT v_cod, bld, Coalesce(corp, ''), taryf1, flat1
        FROM work_oplata
        ORDER BY v_cod, bld, Coalesce(corp, ''), flat1
        INTO: nextStreetId, nextBldNum, nextBldLit, nextPrice, nextFlat
    DO
      BEGIN
        IF (:street_id IS NOT NULL) THEN
          BEGIN
            IF (:nextStreetId != :street_id
                OR :nextBldNum != :bld_num
                OR :nextBldLit != :bld_lit
                OR :nextPrice != :price
                OR :nextFlat - 1 - :flat_to > 0) THEN
              BEGIN
                SUSPEND;
                flat_from = nextFlat;
              END
          END
        ELSE
          flat_from = nextFlat;
        flat_to = nextFlat;
        price = nextPrice;
        street_id = nextStreetId;
        bld_num = nextBldNum;
        bld_lit = nextBldLit;
      END
  IF (:street_id IS NOT NULL) THEN SUSPEND;
END
...
Рейтинг: 0 / 0
03.06.2016, 11:59
    #39249970
rdb_dev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как определить/получить диапазон
akrush, хочу приобрести вот эти квартиры:
PRICESTREET_IDBLD_NUMBLD_LITFLAT_FROMFLAT_TO0.01114330.0421а12120.0214330.0111411
...
Рейтинг: 0 / 0
03.06.2016, 12:53
    #39250044
akrush
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как определить/получить диапазон
rdb_devakrush, хочу приобрести вот эти квартиры:
PRICESTREET_IDBLD_NUMBLD_LITFLAT_FROMFLAT_TO0.01114330.0421а12120.0214330.0111411

Тариф который указан - это стоимость квартплаты за 1м2
...
Рейтинг: 0 / 0
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Как определить/получить диапазон / 25 сообщений из 41, страница 1 из 2
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]