LINUX.ORG.RU

Помогите с запросом на SQL


0

1

Плиз, оч надо(:

Есть два разных запроса на одну и ту же таблицу:

1. SELECT * FROM mytable WHERE feeid = 208 AND country = 'USA';

id  | feeid | min   | max    | fee | country
----+-------+-------+--------+-----+---------
306 | 208   | 0     | 5000   | 99  | USA

2. SELECT * FROM mytable WHERE feeid = 208 AND country IS NULL;

id  | feeid | min   | max    | fee | country
----+-------+-------+--------+-----+---------
307 | 208   | 0     | 5000   | 100 | NULL
308 | 208   | 5001  | 10000  | 150 | NULL
309 | 208   | 10001 | 25000  | 200 | NULL
310 | 208   | 25001 | 100000 | 250 | NULL

Ключом для меня здесь являются поля feeid + min + max.

Необходимо выполнить логическое пересечение результатов двух запросов используя выше перечисленные ключевые поля.

Результатом пересечения должно быть:

id  | feeid | min   | max    | fee | country
----+-------+-------+--------+-----+---------
306 | 208   | 0     | 5000   | 99  | USA
308 | 208   | 5001  | 10000  | 150 | NULL
309 | 208   | 10001 | 25000  | 200 | NULL
310 | 208   | 25001 | 100000 | 250 | NULL


P.S. Postgresql



Последнее исправление: anterior (всего исправлений: 2)

Ответ на: комментарий от trex6

Если мне не изменяет опыт программирования на Оракле двухлетней давности

SELECT id, feeid, min, max, fee, MAX(country)

FROM mytable

WHERE feeid = 208 AND (country = 'USA' OR country IS NULL) GROUP BY id, feeid, min, max, fee

ttnl ★★★★★
()
Ответ на: комментарий от trex6

Нет не правильно, в результат попадут сразу обе записи с id=306 и c id=307

anterior
() автор топика

Вот так сработает:

SELECT id, min, max, MAX(country)
FROM mytable
WHERE id = 208 AND (country = 'USA' OR country IS NULL)
GROUP BY id, min, max 

Но мне нужно чтобы поле fee также показывалось

anterior
() автор топика
Ответ на: комментарий от anterior

А по fee почему не группирует?

Ну тогда как-нибудь так:

SELECT id, AVG(fee), min, max, MAX(country)
FROM mytable
WHERE id = 208 AND (country = 'USA' OR country IS NULL)
GROUP BY id, min, max 
ttnl ★★★★★
()
Ответ на: комментарий от ttnl

> А по fee почему не группирует?
если группировать по fee то в результат попадают сразу обе записи с id=306 и c id=307

Вариант 2 тоже не подходит потому что AVG(fee) показывает именно среднее значение fee а не действительное(

anterior
() автор топика
Ответ на: комментарий от anterior

Напиши MIN(id) и не группируй по id.

Задача ведь элементарная, особенно если есть sql под рукой

ttnl ★★★★★
()

А так?

select id, feeid, min, max, fee, country
  from 
       (SELECT id, feeid, min, max, fee, country, 
               MAX(country) over(partition by feeid, min, max) mcountry
          FROM mytable
         WHERE feeid = 208 
            AND (country = 'USA' OR country IS NULL)) 
 where coalesce(country,'NULL') = coalesce(mcountry,'NULL')
aydar ★★★★★
()
Ответ на: А так? от aydar

Работает!!! Спасибо!!!

А ещё работает вот так, на основе инфы которой давал ttnl:

SELECT tl.* FROM mytable tl
RIGHT JOIN (
   SELECT MAX(id) AS id
   FROM mytable
   WHERE feeid = 208 AND (country = 'USA' OR country IS NULL)
   GROUP BY min, max
   ) tr
ON tl.id = tr.id;

Но до тех пор пока id для country='USA' > id для country=NULL

Так что первый вариант самый правильный

anterior
() автор топика
Ответ на: комментарий от anterior

>country='USA' > id для country=NULL
'USA'>NULL
'A'>NULL
'NULL'>NULL

В твоем примере происходит два обращения к таблице mytable

aydar ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.