Привет у меня есть следующая таблица

P_id    Fname         Lname

1   vaibhav      shukla
2   davalesh      barak
2   sumo          barath
3   kushal        mehra

Теперь мне нужен запрос, который возвращает любую из следующих таблиц

P_id     Fname       Lname

1   vaibhav      shukla
2   davalesh      barak
3   kushal        mehra

ИЛИ

P_id     Fname       Lname

1   vaibhav      shukla
2   sumo          barath
3   kushal        mehra

Быстрое решение приветствуется

0
vasu 14 Янв 2010 в 12:30
Итак, вам нужна случайная строка для каждого отдельного LName?
 – 
MartW
14 Янв 2010 в 12:42

2 ответа

Похоже, вы хотите получить Distinct в одном столбце.

Надеюсь, вы используете SQL Server 2005 или выше

Select First_Name,Last_Name,P_Id
FROM
(
Select First_Name,Last_Name,P_Id

Row_Number() Over (Partition By P_Id Order By First_Name) As RNum

From Table1) T1
WHERE T1.RNum = 1

Идея состоит в том, чтобы назначить отдельный номер строки внутри PID группы, а затем получить тот, у которого RowNumber = 1.

Для SQL Server 2000

Select Distinct First_Name,Last_Name,P_ID
From Table1 T1
INNER JOIN 
(
   Select Min(First_Name) First_Name,P_ID

   From Table1 T1
   Group By P_ID
) T2 ON T1.P_ID = T2.P_ID AND T1.First_Name = T2.First_Name

Примечание. В случае, если две строки имеют одинаковые P_ID и First_Name и разные Last_Name, будут возвращены 2 строки. Я проверяю это.

Другой способ — создать временную таблицу с Identity Column. Затем вместо использования min(First_Name) во внутреннем запросе мы будем использовать группу min(Idenity) по P_ID, а в соединении мы будем использовать P_ID и идентификатор для соединения.

2
Nitin Midha 14 Янв 2010 в 13:18
Я использую ms sql версии 8.0, ваш запрос выдает ошибку --- "Неверный синтаксис рядом с '('"
 – 
vasu
14 Янв 2010 в 12:58
Отредактированный код выше для SQL 2000
 – 
Nitin Midha
14 Янв 2010 в 14:53
select     t1.p_id
,          min(t2.lname) lname
,          min(t2.fname) fname
from       tab t1
inner join tab t2
on         t1.p_id = t2.p_id
where      t2.Lname = (
               select min(lname)
               from   tab t2
               where  t2.p_id = t1.p_id 
           )
group by   t1.p_id
0
Roland Bouman 14 Янв 2010 в 14:00
Извините, но запросы не работают, они снова возвращают всю таблицу
 – 
vasu
14 Янв 2010 в 12:56