Выберите только 1 группу из нескольких - PullRequest
0 голосов
/ 27 августа 2018

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

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  

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

Ответы [ 6 ]

0 голосов
/ 27 августа 2018

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

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
0 голосов
/ 27 августа 2018

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

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.

Демо

0 голосов
/ 27 августа 2018

Вы можете использовать функцию 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

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

0 голосов
/ 27 августа 2018

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

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

Это то, что тебе нужно?

0 голосов
/ 27 августа 2018

Похоже, вы хотите 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.

0 голосов
/ 27 августа 2018

Попробуйте это с 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 
...