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

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

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

Сообщение wofs » 14.12.2017 21:33:03

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

Код: Выделить всё
select
  *
from
  w_tmp_tbl
  inner join
(select
  w_tmp_tbl.idmatchposition,
  max(w_tmp_tbl.id) as id
from
  w_tmp_tbl
group by
  1
order by 1
rows 3) aa on (w_tmp_tbl.id = aa.id)

Изменил запрос под тестовую таблицу, приведенную в моем посте.
Firebird ругнулся на limit - заменил на rows
Немного не понял смысла ограничивать выборку 3 строками.
И результат получился не тем:
2017-12-14_21-30-06.png
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Аватара пользователя
wofs
постоялец
 
Сообщения: 379
Зарегистрирован: 05.10.2009 10:16:55
Откуда: Астрахань

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

Сообщение vitaly_l » 14.12.2017 22:06:56

wofs писал(а):И результат получился не тем:

Напишите обыкновенными словами, какой именно результат Вы хотите получить? и из чего?, и для чего? (иначе непонятно что вы ищите)
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

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

Сообщение wofs » 14.12.2017 22:22:31

vitaly_l писал(а):Напишите обыкновенными словами, какой именно результат Вы хотите получить? и из чего?, и для чего? (иначе непонятно что вы ищите)


Я это и постарался описать здесь: viewtopic.php?f=26&t=25635&p=127512#p127512

Добавлено спустя 5 минут 28 секунд:
Таблица содержит результат выборки WCS сравнения позиций IDMATCHPOSITION с позицией ID у владельца IDOWNER. Чем больше WCS, тем больше позиции соответствуют друг другу.
Задача вывести в грид список IDMATCHPOSITION с соответствующими WCS , ID, IDOWNER. Но нельзя допускать дублирование значения поля IDMATCHPOSITION в результате.
То есть при наличии дубля (строка 3 и 4 в примере по ссылке выше) вывести одну, например, с наименьшим ID.
Аватара пользователя
wofs
постоялец
 
Сообщения: 379
Зарегистрирован: 05.10.2009 10:16:55
Откуда: Астрахань

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

Сообщение vitaly_l » 14.12.2017 22:29:43

wofs писал(а):Я это и постарался описать здесь: viewtopic.php?f=26&t=25635&p=127512#p127512

Нет, там нихрена непонятно. Если вначале топика, ещё хоть как-то можно было уловить смысл, того что вы пытаетесь найти, то как раз после указанного поста, любой смысл искомого теряется. Поэтому и говорю:
Напишите самыми обыкновенными словами:

1) какой именно результат Вы хотите получить?
2) из чего?,
3) для чего?


Добавлено спустя 2 минуты 39 секунд:
wofs писал(а):То есть при наличии дубля (строка 3 и 4 в примере по ссылке выше)

Ну так делайте именно этой колонке GROUP BY? в чём проблема?
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

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

Сообщение wofs » 14.12.2017 22:32:54

vitaly_l писал(а):Поэтому и говорю:
Напишите самыми обыкновенными словами:

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

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

Сообщение vitaly_l » 14.12.2017 22:34:41

wofs писал(а):Написал на одно сообщение выше.

GROUP BY `IDMATCHPOSITION` ?
Последний раз редактировалось vitaly_l 14.12.2017 22:35:38, всего редактировалось 1 раз.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

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

Сообщение wofs » 14.12.2017 22:35:21

vitaly_l писал(а):Ну так делайте именно этой колонке GROUP BY? в чём проблема?

Проблема в том, что по одной колонке group by сделать нельзя. А если делать по всем, то результат ничем не отличается от выборки без group by.

Добавлено спустя 31 секунду:
vitaly_l писал(а):GROUP BY `column` ?


SQL error code = -104.
Invalid expression in the select list (not contained in either an aggregate function or the GROUP BY clause).

Добавлено спустя 1 минуту 25 секунд:
Код: Выделить всё
select t1.IDOWNER, t1.ID, t1.WCS, t1.IDMATCHPOSITION from W_TMP_TBL t1
inner join(
SELECT IDMATCHPOSITION, IDOWNER, MAX(WCS) MWCS FROM W_TMP_TBL
GROUP BY 1,2 ) t2 ON
(t1.WCS=t2.MWCS AND t1.IDMATCHPOSITION = t2.IDMATCHPOSITION AND t1.IDOWNER = t2.IDOWNER)

group by t1.IDMATCHPOSITION

Код: Выделить всё
Dynamic SQL Error.
SQL error code = -104.
Invalid expression in the select list (not contained in either an aggregate function or the GROUP BY clause).

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

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

Сообщение vitaly_l » 14.12.2017 23:17:12

wofs писал(а):SQL Error.

Код: Выделить всё
SELECT ID, IDMATCHPOSITION, IDOWNER, WCS FROM W_TMP_TBL WHERE WCS=(SELECT MAX(WCS) FROM W_TMP_TBL) GROUP BY IDMATCHPOSITION

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

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

Сообщение alexs » 15.12.2017 09:23:20

vitaly_l
Я это уже предлагал. Не то.
wofs
Там может мой второй вариант, но с привязкой по двум колонкам? А в подзапросе группировка по двум полям?
Попробуй переформулировать условие. Сложно доходит.
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4060
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

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

Сообщение vitaly_l » 15.12.2017 09:40:57

alexs писал(а):Я это уже предлагал. Не то.

Между Вашим и моим - запросами, есть очень громадная разница. В частности, в моём, присутствует вот такая подстрока: GROUP BY IDMATCHPOSITION и именно она позволяет найти ТС искомое. Соответственно, этот вариант всё ещё силе (пусть ТС проверит):
Код: Выделить всё
SELECT ID, IDMATCHPOSITION, IDOWNER, WCS FROM W_TMP_TBL WHERE WCS=(SELECT MAX(WCS) FROM W_TMP_TBL) GROUP BY IDMATCHPOSITION

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

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

Сообщение wofs » 15.12.2017 12:10:52

Обязательно проверю, как буду за ноутом. За варианты спасибо.

Добавлено спустя 8 часов 13 минут 52 секунды:
vitaly_l писал(а):
Код: Выделить всё
SELECT ID, IDMATCHPOSITION, IDOWNER, WCS FROM W_TMP_TBL WHERE WCS=(SELECT MAX(WCS) FROM W_TMP_TBL) GROUP BY IDMATCHPOSITION

Код: Выделить всё
Invalid token.
Dynamic SQL Error.
SQL error code = -104.
Invalid expression in the select list (not contained in either an aggregate function or the GROUP BY clause).

Firebird не позволяет так сгруппировать.
alexs писал(а):Там может мой второй вариант, но с привязкой по двум колонкам? А в подзапросе группировка по двум полям?
Попробуй переформулировать условие. Сложно доходит.

Попробую, спасибо.
Это вы уже прочитали?
Таблица содержит результат выборки WCS сравнения позиций IDMATCHPOSITION с позицией ID у владельца IDOWNER. Чем больше WCS, тем больше позиции соответствуют друг другу.
Задача вывести в грид список IDMATCHPOSITION с соответствующими WCS , ID, IDOWNER. Но нельзя допускать дублирование значения поля IDMATCHPOSITION в результате.
То есть при наличии дубля (строка 3 и 4 в примере по ссылке выше) вывести одну, например, с наименьшим ID.


p.s. Спасибо всем за терпение - сложно мне выражать мысли :(

Добавлено спустя 4 минуты 55 секунд:
Всем огромное спасибо!
НА sql.ru подкинули вариант, который устраивает полностью:
Код: Выделить всё
select t1.IDOWNER,min(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)
GROUP BY 1,3,4

Еще раз всем спасибо за терпение.

Добавлено спустя 1 минуту 2 секунды:
2017-12-15_20-29-41.png
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Аватара пользователя
wofs
постоялец
 
Сообщения: 379
Зарегистрирован: 05.10.2009 10:16:55
Откуда: Астрахань

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

Сообщение vitaly_l » 15.12.2017 20:58:26

wofs писал(а):Firebird не позволяет так сгруппировать.

Это предел беспредела в Firebird!
Она похоже не понимает такие запросы:
WCS=(SELECT MAX(WCS) FROM W_TMP_TBL)
(пролистал мельком учебник с кучей запросов, всё через JOIN)
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

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

Сообщение wofs » 16.12.2017 00:12:27

vitaly_l писал(а):Она похоже не понимает такие запросы:
WCS=(SELECT MAX(WCS) FROM W_TMP_TBL)

Она его по своему понимает - выдаст одну строку, с самым максимальным значением.
Проблема как я понял связана с особенностями группировки. Я никак не могу совладать с group by в FireBird :( Помнится в MySQL было с этим несколько по другому.
А может я версию выбрал старую (2.5). Надо попробовать на 3 пересесть.
Аватара пользователя
wofs
постоялец
 
Сообщения: 379
Зарегистрирован: 05.10.2009 10:16:55
Откуда: Астрахань

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

Сообщение vitaly_l » 16.12.2017 11:01:27

wofs писал(а):Она его по своему понимает - выдаст одну строку, с самым максимальным значением.

Она нагло и втихушечку - игнорирует первую часть запроса и выполняет только вторую, которая в скобках. Соответственно при попытке снова обратится к первой - её круто глючит. Короче, очень плохой парсер запросов. Да, и версия: действительно - много меняет. Рекомендуется брать последнюю. Возможно к последней версии они починили парсер.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Пред.

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

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

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

Рейтинг@Mail.ru