несколько условий в одном запросе sql (с и мин) - PullRequest
0 голосов
/ 27 февраля 2020

У меня есть таблица с этими переменными, и я хочу выбрать строку, в которой сумма ЗНАЧЕНИЯ больше 1000, и в то же время МЕСЯЦ является минимальным

|CLIENT     |MONTH         |VALUE
|1          |1             |500            
|1          |2             |1050
|1          |3             |1100

результат должен быть таким :

|CLIENT|MONTH|VALUE
|1     |2    |1050

Возможно ли сделать это только одним запросом?

Моя попытка:

       SELECT 
       client,            
       SUM(value) AS SUM_of_value, 
       MIN(month) AS MIN_of_month, 

      FROM mytable 
      GROUP BY 1
      having SUM_of_value>1000;

Ответы [ 4 ]

0 голосов
/ 27 февраля 2020

Заимствование у Гордона и Форпа. Ваш пример данных и вывод кажутся слишком простыми c. Я думаю, что вы хотели бы одну строку на клиента.

select t.client, t.month, t.value
from (
select client, month, sum(value) as value, row_number() over (partition by client order by month) rn
from my_table
group by client, month
having sum(value) > 1000
) t
where t.rn = 1
0 голосов
/ 27 февраля 2020

Вы можете попытаться использовать соединение между вашим запросом и группой запросов по клиенту и месяцу

select  t.client,  t2.SUM_of_value, t2.MIN_of_month
from  (
       SELECT 
       client,            
       SUM(value) AS SUM_of_value, 
       MIN(month) AS MIN_of_month, 
       FROM mytable 
       GROUP BY 1
       having SUM_of_value>1000;
) t1 
inner join (
       SELECT 
       client,            
       month , 
       SUM(value) AS SUM_of_value
       FROM mytable 
       GROUP BY 1,2
       having SUM_of_value>1000;
) t2 ON t2.client = t1.client 
    AND t2.month  = t1.MIN_of_month
0 голосов
/ 27 февраля 2020

Если для каждого MONTH имеется только 1 VALUE, используйте ROW_NUMBER() оконную функцию:

select t.CLIENT, t.MONTH, t.VALUE
from (
  select *, row_number() over (partition by client order by month) rn
  from mytable
  where value > 1000
) t
where t.rn = 1

См. demo . Результаты:

| CLIENT | MONTH | VALUE |
| ------ | ----- | ----- |
| 1      | 2     | 1050  |
0 голосов
/ 27 февраля 2020

Если вам нужна одна строка, то вы можете использовать order by:

select t.*
from mytable
where value > 1000
order by month
fetch first 1 row only;

Я не уверен, почему ваш запрос ссылается на «сумму значения», потому что в месяц есть только одно значение для данных в вопросе.

РЕДАКТИРОВАТЬ:

Судя по комментарию, вы действительно хотите запрос агрегации:

select client, month, sum(value)
from 
group by client, month
having sum(value) > 1000
order by month
fetch first 1 row only;
...