Выберите только 1 группу из нескольких

У меня есть стол

Id | Provider | Value | IsNew

Я хочу выбрать из этой таблицы уникальные Provider и Value для него.

SELECT Provider, Value
FROM Table
GROUP BY Provider, Value

Но мне нужно сгруппировать по полю IsNew, так как мне нужно выбрать только «Новая» запись, когда Provider = '3'.

Должно получиться что-то вроде:

Id | Provider | Value | IsNew
______________________________
1  | 1        | 310   | 0
______________________________
2  | 2        | 25    | 0
______________________________
3  | 3        | 250   | 0
______________________________
4  | 3        | 252   | 1

в результате мне нужно выбрать

Provider | Value 
_________________
1        | 310   
_________________
2        | 25    
_________________
3        | 252  

В реальном примере запрос намного сложнее, надеюсь, я прекрасно объясню, что хочу.

ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
1
0
63
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

Попробуйте это с row_number:

    select provider, value from 
(SELECT Provider,value row_number over (partition by provider order by isnew desc) as rn
    FROM Table) a where rn=1 

Значение также может быть меньше "старого" значения, поэтому это не решение.

demo 27.08.2018 15:12

измененный запрос ... вы можете попробовать с row_number

Fahmi 27.08.2018 15:14
Ответ принят как подходящий

Кажется, вам нужен isNew = 1, если он существует, а в противном случае - другая запись.

Я думаю, это то, что вы хотите:

SELECT t.Provider, t.Value
FROM Table t
WHERE t.isNew = 1
UNION ALL
SELECT t.Provider, t.Value
FROM Table t
WHERE t.isNew = 0 AND
      (NOT EXISTS (SELECT 1 FROM table t2 WHERE t2.Provide = t.Provide AND t2.isNew = 1);

Здесь - скрипт SQL.

Я не знаю, разрешено ли это комментировать, по правде говоря, нет. Но, черт возьми, пост! :) Мне потребовалось почти 2 минуты, чтобы просто прочитать вопрос и придумать решение. Отличная работа

SqlKindaGuy 27.08.2018 15:14
sqlfiddle.com/#!18/2e416/2 что-то не совсем то, что мне нужно ... и я не могу понять, в чем проблема
demo 27.08.2018 16:05

Может быть, я не очень хорошо это понял, но мне это кажется довольно коротким вопросом:

select provider, value
  from my_table
  where not (provider = '3' and isnew = 0)
  group by provider, value

Это то, что тебе надо?

этот запрос не будет считать записи, если для provider = 3 есть только одна запись с IsNew = 0

demo 27.08.2018 15:43

Вы можете использовать функцию ROW_NUMBER () точно так же, как предложил пользователь fa06. Использование общего табличного выражения в приведенном ниже примере для достижения желаемого результата

;WITH CTE AS
(
  SELECT Provider, Value, ROW_NUMBER() OVER (PARTITION BY Provider ORDER BY IsNew DESC) 
  AS Row_Rank FROM Test 
)
SELECT * FROM CTE WHERE Row_Rank = 1

Вот рабочий пример: http://sqlfiddle.com/#!18/2e416/19

Пожалуйста, дайте мне знать, поможет ли это

Попробуй это:

select provider,
       [value], 
       isnew
from (
    select provider,
           [value], 
           isnew,
           row_number() over (partition by Provider order by isnew desc) rn
    from test
) a where rn = 1

Он выберет только одну строку для каждого provider, также он выберет новую, если она есть, благодаря row_number с предложением order by isnew desc.

Демо

Это мои два цента:

SELECT a.Provider, a.Value, a.IsNew
FROM Table a LEFT JOIN Table b ON a.Provider = b.Provider AND a.IsNew <> b.IsNew
WHERE a.IsNew = 1 OR b.IsNew IS NULL

И вывод:

Provider Value IsNew
-------- ----- -----
1          310     0
2           25     0
3          252     1

Другие вопросы по теме