У меня есть стол
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
В реальном примере запрос намного сложнее, надеюсь, я прекрасно объясню, что хочу.


Попробуйте это с 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
измененный запрос ... вы можете попробовать с row_number
Кажется, вам нужен 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 минуты, чтобы просто прочитать вопрос и придумать решение. Отличная работа
Может быть, я не очень хорошо это понял, но мне это кажется довольно коротким вопросом:
select provider, value
from my_table
where not (provider = '3' and isnew = 0)
group by provider, value
Это то, что тебе надо?
этот запрос не будет считать записи, если для provider = 3 есть только одна запись с IsNew = 0
Вы можете использовать функцию 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
Значение также может быть меньше "старого" значения, поэтому это не решение.