Firebird: выборка строк с максимальным значением [РЕШЕНО]

Модератор: Модераторы

Firebird: выборка строк с максимальным значением [РЕШЕНО]

Сообщение wofs » 14.12.2017 13:18:54

Доброго дня.
Никак не могу решить задачку:
Есть таблица w_tmp_tbl_neutralsearch:
Код: Выделить всё
ID    IDOWNER    IDMATCHPOSITION    WCS
//Все поля имеют тип Integer


Поле ID содержит некий уникальный номер
Поля IDOWNER, IDMATCHPOSITION, WCS - неуникальные значения.

Нужно вывести только строки, содержащие максимальные значения WCS
Если я выбираю так:
Код: Выделить всё
SELECT IDOWNER, IDMATCHPOSITION, MAX(WCS) MWCS FROM w_tmp_tbl_neutralsearch
WHERE WCS>50
GROUP BY 1,2,ID

То все путем:
no_ID.png

Но Вот мне понадобилось добавить в результат поле ID, которое содержит уникальные записи. Я изменил запрос и в итоге получил, что просил, но не то, что надо:
Код: Выделить всё
SELECT IDOWNER, IDMATCHPOSITION, ID, MAX(WCS) MWCS FROM w_tmp_tbl_neutralsearch_debug
WHERE WCS>50
GROUP BY 1,2,3

ID.png


Как мне получить результат 1, но с дополнительным полем ID?
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Последний раз редактировалось wofs 30.03.2018 22:56:08, всего редактировалось 1 раз.
Аватара пользователя
wofs
постоялец
 
Сообщения: 375
Зарегистрирован: 05.10.2009 10:16:55
Откуда: Астрахань

Re: Firebird: выборка строк с максимальным значением

Сообщение kosteek » 14.12.2017 14:10:37

Ты хочешь вывести 1 результат для какого поля?
но с дополнительным полем ID?

Что должно при этом содержать ID, какую из записей уникальных?
kosteek
постоялец
 
Сообщения: 203
Зарегистрирован: 24.07.2008 14:57:09
Откуда: Украина, г.Славянск

Re: Firebird: выборка строк с максимальным значением

Сообщение wofs » 14.12.2017 14:36:11

kosteek писал(а):Что должно при этом содержать ID, какую из записей уникальных?

Которая соотвествует максимальному WCS.
Если смотреть пример (см. результат 2), то должно получиться:
Код: Выделить всё
IDOWNER -> 6
IDMATCHPOSITION -> 1941564
ID -> 910536
MWCS -> 63

То есть просто в результат 1 добавить поле ID, с соответствующим значением.

Надо как бы убрать дублирование IDMATCHPOSITION, но с оглядкой на максимальное значение WCS.
Аватара пользователя
wofs
постоялец
 
Сообщения: 375
Зарегистрирован: 05.10.2009 10:16:55
Откуда: Астрахань

Re: Firebird: выборка строк с максимальным значением

Сообщение kosteek » 14.12.2017 14:45:50

Без JOIN не обойтись

А если максимальных WCS несколько, тогда какой ID нужно отобрать?
kosteek
постоялец
 
Сообщения: 203
Зарегистрирован: 24.07.2008 14:57:09
Откуда: Украина, г.Славянск

Re: Firebird: выборка строк с максимальным значением

Сообщение wofs » 14.12.2017 14:54:27

kosteek писал(а):А если максимальных WCS несколько, тогда какой ID нужно отобрать?

Первый попавшийся. Можно минимальный.
kosteek писал(а):Без JOIN не обойтись

У меня корректно не получилось...

Добавлено спустя 1 минуту 15 секунд:
Само собой с оглядкой на
Код: Выделить всё
IDOWNER
IDMATCHPOSITION
WCS


Добавлено спустя 2 минуты 19 секунд:
Таблица содержит некий результат сравнения. WCS - % соответствия значения, на которое ссылается поле IDMATCHPOSITION значению, на которое ссылается поле ID.
Требуется выбрать наиболее подходящий результат.
Аватара пользователя
wofs
постоялец
 
Сообщения: 375
Зарегистрирован: 05.10.2009 10:16:55
Откуда: Астрахань

Re: Firebird: выборка строк с максимальным значением

Сообщение kosteek » 14.12.2017 14:58:18

Попробуй так
Код: Выделить всё
SELECT IDOWNER, IDMATCHPOSITION, MIN(ID) as MINID, MAX(WCS) as  MWCS FROM w_tmp_tbl_neutralsearch_debug
WHERE WCS>50
GROUP BY 1,2,3
kosteek
постоялец
 
Сообщения: 203
Зарегистрирован: 24.07.2008 14:57:09
Откуда: Украина, г.Славянск

Re: Firebird: выборка строк с максимальным значением

Сообщение alexs » 14.12.2017 15:00:00

Подзапросом найти максимальное значение. В основном запросе отобразить все строки, значение которых нашёл подзапросом
Аватара пользователя
alexs
долгожитель
 
Сообщения: 3674
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

Re: Firebird: выборка строк с максимальным значением

Сообщение wofs » 14.12.2017 15:04:26

kosteek писал(а):Попробуй так

Получим MINID без привязки к WCS

Добавлено спустя 8 минут 44 секунды:
alexs писал(а):Подзапросом найти максимальное значение. В основном запросе отобразить все строки, значение которых нашёл подзапросом

Делал вот так:
Код: Выделить всё
select t1.IDOWNER, t1.ID, t1.WCS,PLWCSMAX.IDMATCHPOSITION from w_tmp_tbl_neutralsearch_debug t1
inner join
(SELECT IDOWNER,IDMATCHPOSITION, MAX(WCS) MWCS FROM w_tmp_tbl_neutralsearch_debug WHERE WCS>50
GROUP BY 1,2) PLWCSMAX ON (t1.WCS=PLWCSMAX.MWCS AND t1.IDOWNER=PLWCSMAX.IDOWNER)

но получаю какую-то ересь:
join.png


Притом, что "сырая" выборка с сортировкой по WCS выглядит так (часть):
all.png


Добавлено спустя 9 минут 57 секунд:
Хм... вроде получилось таким запросом:
Код: Выделить всё
select t1.IDOWNER, t1.ID, t1.WCS,t1.IDMATCHPOSITION from w_tmp_tbl_neutralsearch_debug t1
inner join
(SELECT IDOWNER,IDMATCHPOSITION, MAX(WCS) MWCS FROM w_tmp_tbl_neutralsearch_debug WHERE WCS>50
GROUP BY 1,2) PLWCSMAX ON (t1.WCS=PLWCSMAX.MWCS AND t1.IDOWNER=PLWCSMAX.IDOWNER AND t1.IDMATCHPOSITION=PLWCSMAX.IDMATCHPOSITION)


Добавлено спустя 6 минут 34 секунды:
А как избавиться от дубликата во 2 и 3 строках (получается из-за равного WCS для одинакового IDMATCHPOSITION)?
2017-12-14_15-26-51.png

Мне нужен любой один из дубликатов.

Добавлено спустя 13 минут 47 секунд:
И все одно - результат неверен (в результате слишком много повторяющихся ID). Сделаю тестовую таблицу, вернусь сюда с ней :)
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Последний раз редактировалось wofs 14.12.2017 15:56:48, всего редактировалось 1 раз.
Аватара пользователя
wofs
постоялец
 
Сообщения: 375
Зарегистрирован: 05.10.2009 10:16:55
Откуда: Астрахань

Re: Firebird: выборка строк с максимальным значением

Сообщение vitaly_l » 14.12.2017 15:55:41

wofs писал(а):Мне нужен любой один из дубликатов.

Код: Выделить всё
LIMIT 1
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: Firebird: выборка строк с максимальным значением

Сообщение wofs » 14.12.2017 15:58:39

vitaly_l писал(а):LIMIT 1

В firebird
Код: Выделить всё
rows 1

Но это даст только одну запись.
Аватара пользователя
wofs
постоялец
 
Сообщения: 375
Зарегистрирован: 05.10.2009 10:16:55
Откуда: Астрахань

Re: Firebird: выборка строк с максимальным значением

Сообщение alexs » 14.12.2017 16:51:00

Попробуй так
Должен получть все строки с максимальным WCS
Код: Выделить всё
select
  *
from
  w_tmp_tbl_neutralsearch
where
  WCS =
    (select
       max(w_tmp_tbl_neutralsearch.WCS)
     from
       w_tmp_tbl_neutralsearch)
Аватара пользователя
alexs
долгожитель
 
Сообщения: 3674
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

Re: Firebird: выборка строк с максимальным значением

Сообщение wofs » 14.12.2017 16:55:38

Как выяснилось, уникальности нет нигде. Но можно дополнить таблицу уникальным полем, при необходимости.

Код: Выделить всё
CREATE TABLE W_TMP_TBL (
    IDOWNER          BIGINT,
    ID               BIGINT,
    WCS              INTEGER,
    IDMATCHPOSITION  BIGINT
);


Есть данные в ней:
Код: Выделить всё
INSERT INTO W_TMP_TBL (IDOWNER, ID, WCS, IDMATCHPOSITION)
               VALUES (1, 68, 25, 11);
INSERT INTO W_TMP_TBL (IDOWNER, ID, WCS, IDMATCHPOSITION)
               VALUES (1, 61, 30, 11);
INSERT INTO W_TMP_TBL (IDOWNER, ID, WCS, IDMATCHPOSITION)
               VALUES (1, 64, 45, 11);
INSERT INTO W_TMP_TBL (IDOWNER, ID, WCS, IDMATCHPOSITION)
               VALUES (1, 62, 67, 13);
INSERT INTO W_TMP_TBL (IDOWNER, ID, WCS, IDMATCHPOSITION)
               VALUES (1, 63, 67, 13);
INSERT INTO W_TMP_TBL (IDOWNER, ID, WCS, IDMATCHPOSITION)
               VALUES (1, 65, 12, 15);
INSERT INTO W_TMP_TBL (IDOWNER, ID, WCS, IDMATCHPOSITION)
               VALUES (1, 67, 45, 17);
INSERT INTO W_TMP_TBL (IDOWNER, ID, WCS, IDMATCHPOSITION)
               VALUES (1, 66, 89, 17);

Выглядит это так:
t_all.png

Запросом:
Код: Выделить всё
select t1.IDOWNER,t1.ID,t1.WCS,t1.IDMATCHPOSITION from W_TMP_TBL t1
inner join(
SELECT IDMATCHPOSITION, MAX(WCS) MWCS FROM W_TMP_TBL
GROUP BY IDMATCHPOSITION ) t2 ON
(t1.WCS=t2.MWCS AND t1.IDMATCHPOSITION = t2.IDMATCHPOSITION)

я получаю годный результат:
t_sql1.png

За исключением строк 3 и 4 - дубликаты (по полям WCS, IDMATCHPOSITION).

Добавлено спустя 2 минуты 34 секунды:
alexs писал(а):Должен получть все строки с максимальным WCS

Получил, только одну и с наибольшим значением.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Аватара пользователя
wofs
постоялец
 
Сообщения: 375
Зарегистрирован: 05.10.2009 10:16:55
Откуда: Астрахань

Re: Firebird: выборка строк с максимальным значением

Сообщение alexs » 14.12.2017 17:57:28

wofs писал(а):Получил, только одну и с наибольшим значением.

А тебе как надо?
Аватара пользователя
alexs
долгожитель
 
Сообщения: 3674
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

Re: Firebird: выборка строк с максимальным значением

Сообщение wofs » 14.12.2017 18:45:27

alexs писал(а):А тебе как надо?

Мой пост выше, на последней картинке - все гуд. Только дубляж по полям WCS, IDMATCHPOSITION в строках 3 и 4 исключить и все!

Добавлено спустя 59 секунд:
Ссылка на пост:
viewtopic.php?f=26&t=25635&p=127515#p127512
Аватара пользователя
wofs
постоялец
 
Сообщения: 375
Зарегистрирован: 05.10.2009 10:16:55
Откуда: Астрахань

Re: Firebird: выборка строк с максимальным значением

Сообщение alexs » 14.12.2017 19:40:34

А вот тогда вот если так?

Код: Выделить всё
select
  *
from
  w_tmp_tbl_neutralsearch
  inner join
(select
  w_tmp_tbl_neutralsearch.idmatchposition,
  max(w_tmp_tbl_neutralsearch.id) as id
from
  w_tmp_tbl_neutralsearch
group by
  1
order by 1
limit
  3) aa on (w_tmp_tbl_neutralsearch.id = aa.id)
Аватара пользователя
alexs
долгожитель
 
Сообщения: 3674
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

След.

Вернуться в Базы данных

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1

Рейтинг@Mail.ru