Как выбрать отдельные элементы, когда они появляются повторяться в таблице? (T-SQL) - PullRequest
0 голосов
/ 11 февраля 2009

Рассмотрим следующую таблицу:

create table temp
(                  
    name int,
    a int,
    b int
)

insert into temp (name, a, b)
values (1, 2, 3)

insert into temp (name, a, b)
values (1, 4, 5)

insert into temp (name, a, b)
values (2, 6, 7)

Я хочу выбрать * (все поля) с отличным [имя]. В случае, когда две или более строки имеют одно и то же [имя], чтобы выбрать, отображать ли первую (1, 2, 3) или вторую строку (1, 4, 5), можно выбрать правило с большей [Ь].

Можете ли вы указать, как мне написать эту хранимую процедуру?

Ответы [ 4 ]

4 голосов
/ 11 февраля 2009
SELECT t.*
FROM temp t
INNER JOIN (
  SELECT name, max(b) as b
  FROM temp
  GROUP BY name
) m
ON t.name = m.name
AND t.b = m.b

Не совсем быстро для больших таблиц, если у вас нет индекса по имени, b.

2 голосов
/ 11 февраля 2009

В MSSQL 2005 и выше:

SELECT name, a, b
FROM (
    SELECT temp.*, ROW_NUMBER() OVER (PARTITION BY name ORDER BY b DESC) AS rn
    FROM   temp
) t
WHERE rn = 1
1 голос
/ 11 февраля 2009

Вот один из способов сделать это sql 2000 и выше версия

select t1.* from(
select name,max(B) as MaxB
from temp
group by name) t2 
join temp t1 on t1.a = t2.MaxB
and t1.name = t2.name

SQL 2005 и более поздняя версия

select name, a, b
from (
select m.*,
row_number() over (
partition by name
order by B desc) as rn
from temp m
) m2
where m2.rn = 1;
0 голосов
/ 11 февраля 2009
CREATE VIEW Max_B_From_Temp AS
SELECT name,Max(b) as b
FROM temp
GROUP BY name

SELECT temp.* 
FROM temp INNER JOIN Max_B_From_Temp 
ON 
    temp.name=Max_B_From_Temp.name and 
    temp.b=Max_B_From_Temp.b

Это не хранимая процедура, но вы можете вызвать запрос из одного.

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