Получить определенное значение в группе по заявлению - PullRequest
1 голос
/ 24 апреля 2019

У меня есть следующие три строки данных:

id       price          type
1        19.99          PERM
1        30.13          TEMP
2        14.44          SOME

Я бы хотел сгруппировать по id и получить цену, а цена TEMP когда-либо существует, используйте ее как значение по умолчанию,Вот пример того, каким должен быть результат:

id        price
1         30.13
2         14.44

До сих пор я застрял на group by:

SELECT 
GROUP_CONCAT(tp.price_value order by tp.price_type='temp' desc limit 1)
FROM prices GROUP BY id

Как бы я отдал приоритет цене (order by, limit 1) в вышеприведенном?

Мои две идеи теперь состоят в том, чтобы сделать два запроса (объединение кажется излишним ?!) или постобработать group_concat на языке программирования.Ни то, ни другое не кажется слишком желанным, так что, надеюсь, здесь есть лучший, более простой подход.

Ответы [ 5 ]

3 голосов
/ 24 апреля 2019

Вы можете использовать следующее решение, используя GROUP BY с MAX:

SELECT id, IFNULL(maxTemp, maxOther) AS maxPrice
FROM (
    SELECT id,
        MAX(CASE WHEN type = 'TEMP' THEN price ELSE NULL END) maxTemp, 
        MAX(CASE WHEN type <> 'TEMP' THEN price ELSE NULL END) maxOther
    FROM table_name
    GROUP BY id
)t;

Это решение должно дать вам правильные результаты для ваших требований (ORDER BY ... DESC LIMIT 1).


Но вы также можете использовать другие агрегатные функции , чтобы получить SUM или список (используя GROUP_CONCAT) значений цен.

Решение для получения SUM значений цен:

SELECT id, IFNULL(sumTemp, sumOther) AS sumPrice
FROM (
    SELECT id,
        SUM(CASE WHEN type = 'TEMP' THEN price ELSE NULL END) sumTemp, 
        SUM(CASE WHEN type <> 'TEMP' THEN price ELSE NULL END) sumOther
    FROM table_name
    GROUP BY id
)t;

... или получить список значений цен с помощью функции GROUP_CONCAT:

SELECT id, IFNULL(gTemp, gOther) AS listPrice
FROM (
    SELECT id,
        GROUP_CONCAT(CASE WHEN type = 'TEMP' THEN price ELSE NULL END) gTemp, 
        GROUP_CONCAT(CASE WHEN type <> 'TEMP' THEN price ELSE NULL END) gOther
    FROM table_name
    GROUP BY id
)t;

demoна dbfiddle.uk

1 голос
/ 24 апреля 2019

Вы можете использовать объединение идентификатора с «TEMP» и запроса для идентификатора с «TEMP»

  select id, price
  from  my_table 
  where type ='TEMP'
  union 
  select id, max(price) 
  from my_table m1
  inner join (
  select id from my_table where id not in (
    selet id
    from my_table 
    where  type 'TEMP'
  ) 
  group by id 
  ) t1 on t1.id= m1.id 
0 голосов
/ 27 апреля 2019

Это, безусловно, самый хакерский подход (два других ответа здесь - более правильные ответы), но вы также можете использовать оператор CONCAT, чтобы добавить сортировку «в» само поле. Вот базовый пример:

SELECT id, RIGHT(
    max(CONCAT(if(type='temp', 1,0), '^', price)),
    length(max(CONCAT(if(type='temp', 1,0), '^', price)))-2
) price FROM prices group by id

1   30.13
2   14.44

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

0 голосов
/ 24 апреля 2019

это будет работать:

select * from(select a.id,a.type,
(select b.price from Table1  b where b.type=a.type and b.type in ('Temp')) mn
from Table1 a group by id,type)ab where mn is not null
union 
select id,type,max(price) from Table1
where type is not null 
and id not in(select id from(select a.id,a.type,
(select b.price from Table1  b where b.type=a.type and b.type in ('Temp')) mn
from Table1 a group by id,type)ab where mn is not null)
group by id,type;

чек http://sqlfiddle.com/#!9/c166a9/9

0 голосов
/ 24 апреля 2019

попробуйте, как показано ниже, используя объединение и коррелированный подзапрос

  select id,max(price) as price from prices
  where type='temp' group by id
  union 
  select id,max(price) from prices t1
  where not exists( select 1 from prices t2 where t1.id=t2.id
                   and type='temp')
     group by id

, так как вам нужен весь тип temp, поэтому 1-й запрос примет все выходные данные temp, а 2-й запрос отфильтрует всю временную группу

онлайн демо

вывод

id  price
1   30.13
2   14.44
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...