powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Как определить/получить диапазон
25 сообщений из 41, страница 1 из 2
Как определить/получить диапазон
    #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
Как определить/получить диапазон
    #39248895
akrush
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
№дома, код ул. и корп. чуть-чуть сместились
...
Рейтинг: 0 / 0
Как определить/получить диапазон
    #39248902
Фотография DarkMaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
akrush,

WHERE ?
...
Рейтинг: 0 / 0
Как определить/получить диапазон
    #39248935
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Оконные функции?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как определить/получить диапазон
    #39248982
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
akrush, если непрерывность диапазона квартир относительно ключевых полей где-то прерывается, тогда что надо получить? Максимально большой диапазон?
...
Рейтинг: 0 / 0
Как определить/получить диапазон
    #39249000
akrush
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_devakrush, если непрерывность диапазона квартир относительно ключевых полей где-то прерывается, тогда что надо получить? Максимально большой диапазон?
2 диапазона с разрывом
...
Рейтинг: 0 / 0
Как определить/получить диапазон
    #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
Как определить/получить диапазон
    #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
Как определить/получить диапазон
    #39249014
stelvic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
проще всего это сделать хранимой процедурой или execute block
...
Рейтинг: 0 / 0
Как определить/получить диапазон
    #39249017
Фотография S.G.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
akrushrdb_devakrush, если непрерывность диапазона квартир относительно ключевых полей где-то прерывается, тогда что надо получить? Максимально большой диапазон?
2 диапазона с разрывомих может быть и больше чем два.
в общем виде, для одной стоимости, у вас может получиться что-то вида:
278-280, 299-299, 320-323 и т.д.
Вы все-таки пересмотрите, что именно надо получить.
...
Рейтинг: 0 / 0
Как определить/получить диапазон
    #39249019
akrush,

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

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

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

Скрипт с инсертами
...
Рейтинг: 0 / 0
Как определить/получить диапазон
    #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
Как определить/получить диапазон
    #39249727
akrush
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый Э - Эх,

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

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

если 2.5 то хранимка или execute block
...
Рейтинг: 0 / 0
Как определить/получить диапазон
    #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
Как определить/получить диапазон
    #39249944
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
akrush, как считать разрыв номеров квартир более чем на единицу, если поля flat1 и flat2 символьные и могут содержать литеры?
...
Рейтинг: 0 / 0
Как определить/получить диапазон
    #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
Как определить/получить диапазон
    #39249970
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
akrush, хочу приобрести вот эти квартиры:
PRICESTREET_IDBLD_NUMBLD_LITFLAT_FROMFLAT_TO0.01114330.0421а12120.0214330.0111411
...
Рейтинг: 0 / 0
Как определить/получить диапазон
    #39250044
akrush
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_devakrush, хочу приобрести вот эти квартиры:
PRICESTREET_IDBLD_NUMBLD_LITFLAT_FROMFLAT_TO0.01114330.0421а12120.0214330.0111411

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


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