2012-07-04 4 views
1

У меня есть база данных на SQLServer, в которой есть несколько строк для базы данных с именем emp_details. Таблица содержит несколько полей, одна из которых - зарплата. Заработная плата не уникальна для сотрудников, и мне нужно получить одну полную строку для каждой уникальной стоимости зарплаты.Получение полных строк на основе уникальных значений из уникального столбца

Пожалуйста, дайте мне знать запрос, который может помочь.

Образец базы данных:

a b  c d  e f 

17 IL11 53 IL11 48 58 
26 IL10 53 IL10 48 58 
31 IL15 53 IL15 48 58 
32 IL16 53 IL16 24 58 
33 IL17 53 IL17 36 58 
34 IL18 53 IL18 36 58 
37 IL21 53 IL21 36 58 
40 IL24 53 IL24 48 58 

Я хочу, чтобы фильтровать это на колонку е (считать его зарплату поля)

+0

один полный ряд соответствующих всем уникальных зарплатами, а не только один – rahulritesh

+0

Вы хотите только те строки, которые имеют зарплаты, которые не повторяются нигде? –

+0

Да! Только те строки, у которых есть зарплаты, которые не повторяются нигде в этом поле – rahulritesh

ответ

1

неуверен, если это лучше производительность мудры, как нет схемы. Но это должно сработать.

WITH Emp_Salary 
AS 
(
    SELECT 
     Column1 
     , Column2 
     , Salary 
     , ROW_NUMBER() OVER (PARTITION BY Salary ORDER BY Column1) r --numbers each row uniquely per salary 
     FROM emp_details 
) 
SELECT 
    Column1 
    , Column2 
    , Salary 
FROM Emp_Salary 
WHERE r = 1 -- Filters all but the first row per salary. 
; 
+0

Недопустимое имя столбца 'r' - это то, что я получаю – rahulritesh

+0

Моя ошибка, внешний запрос не ссылается на CTE. Исправлено сейчас –

+0

Я сомневаюсь, что это то, что хочет OP. Для OP: если франк зарабатывает 100 долларов, а пей зарабатывает 100 $, это вернет одну запись (с откровенным или петиным в зависимости от порядка по предложению). –

0

select distinct salary from emp_details даст вам диапазон значений заработной платы.

Чтобы получить другие строки ... как вы хотите выбрать, какую строку вы хотите?

, если у вас есть ПК удостоверения личности вы могли бы сделать

select * from emp_details where id in ( select Max(id),Salary from emp_details group by salary )

+0

не имеют PK: -/ – rahulritesh

1
SELECT 
    * 
FROM 
    emp_details 
WHERE 
    Salary IN(
       SELECT 
        Salary 
       FROM 
        emp_details 
       GROUP BY 
        Salary 
       HAVING 
        COUNT(*) = 1 
      ) 
+0

Получил всего 1 ряд в результате! – rahulritesh

+1

@rahulritesh - Мы не можем видеть ваши данные, но утверждение верно.Это означает, что в вашей таблице всего ** одна ** уникальная зарплата. –

+0

Извините, но, как я уже сказал, в поле есть несколько уникальных зарплат – rahulritesh

0

Вы не должны использовать оператор IN, если ваш внутренний запрос возвращает много строк. Кроме того, count (*) будет намного медленнее, чем count (id).

Это один может быть быстрее:

SELECT emp.* 
    FROM emp_details emp 
    WHERE exists (SELECT a 
        from emp_details 
        where e = emp.e 
        group by e 
         having count(a) = 1 
       ); 
Смежные вопросы