2011-12-29 4 views
3

У меня возникли проблемы с выяснением правильного синтаксиса для того, что мне нужно для вывода из моего запроса.Ограничить вывод строки

Вот мои данные (нет, это не правильные имена столбцов, я пытаюсь упростить их чтение). Фактическая таблица, из которой я выхожу, имеет 26 столбцов данных.

employeeNumber - recordNumber - job    - dept - type 
12   - 1   - stapler   - 788 - s 
12   - 6   - paper pusher  - 400 - s 
18   - 2   - phone cleaner  - 600 - p 
18   - 4   - sweeper   - 567 - s 
19   - 0   - typist    - 400 - s 
21   - 0   - mouse ball cleaner - 400 - p 

Итак, вот правила отбора:
Если тип P выбрать эту запись
Если работник не имеет P записи, выберите S
Если сотрудник имеет несколько записей S, выберите нижний номер записи ИЛИ выберите запись о том, что Департамент НЕ 400 (400 строка всегда с большим номером записи)
Если есть только один S записи, и Dept 400 строка должна быть возвращена

Это то, что является В настоящее время работает:

SELECT employeeNumber, recordNumber, job, dept, type 
FROM employees 
WHERE (type = 'P') 
OR 
(type = 'S' 
      AND employeeNumber NOT IN 
       (
        SELECT employeeNumber 
        FROM employees 
        WHERE type = 'P' 
       ) 
) 
ORDER BY employeeNumber, recordNumber 

И то, что я хочу сделать, это поставить «предел = 1» (или что-то подобное) в конце, так что в случае нескольких строк S нижний RecordNumber будет строка, которая является вернулся.

Это набор записей, которые должны быть возвращены из данных выше:

employeeNumber - recordNumber - job    - dept - type 
12   - 1   - stapler   - 788 - s 
18   - 2   - phone cleaner  - 600 - p 
19   - 0   - typist    - 400 - s 
21   - 0   - mouse ball cleaner - 400 - p 

Ясно как грязь, не так ли?

Я продолжаю получать ошибки. Есть ли «простой» способ сделать это, что я просто отсутствую?

Спасибо за любую помощь, которую вы можете дать.

Мишель

ответ

1

Я не undestood очень хорошо эту часть:

выбрать нижний номер записи или выберите запись о том, что Департамент является НЕ 400 (400 строк всегда будет выше номер записи)

(Если «400 строк всегда будет более высокий номер записи», то левая часть OR достаточно)

Однако это точка начала. (Я распустил часть после OR)

SELECT * FROM (
    SELECT employeeNumber, recordNumber, job, dept, type 
    rank() over (partition by employeeNumber order by type, recordNumber) as rnk 
    FROM employees 
) 
WHERE type = 'P' or (rnk=1 and type=S) 
+0

OR, относящийся к более низкому номеру записи/не отделу 400, был только там для информации. Вы правы, для этого достаточно левых. Я дам вам немного попробовать попробовать (я сейчас в колене в другой проблеме). – Michelle

0

Если ваши данные не могут иметь дубликат TYPE и значения RecordNumber в пределах employeNumber, то @ ответы работ Флорина. В противном случае, если есть вероятность, что ваш ORDER BY в аналитической функции даст две строки с одинаковым рангом, вы снова получите повторяющиеся строки. Я хотел бы использовать ROW_NUMBER вместо этого, и ИНЕКЕ можно упростить, чтобы просто выбрать все строки с строки числом 1 (которые вы могли бы сделать с @ запрос Флорин а):

CREATE TABLE employees (employeeNumber INTEGER, recordNumber INTEGER 
      , job VARCHAR2(100), dept INTEGER, TYPE VARCHAR2(2)); 

INSERT INTO employees VALUES (12, 6, 'paper pusher', 400, 'S'); 
INSERT INTO employees VALUES (18, 2, 'phone cleaner', 600, 'P'); 
INSERT INTO employees VALUES (18, 4, 'sweeper', 567, 'S'); 
INSERT INTO employees VALUES (19, 0, 'typist', 400, 'S'); 
INSERT INTO employees VALUES (21, 0, 'mouse ball cleaner', 400, 'P'); 
INSERT INTO employees VALUES (12, 1, 'stapler', 788, 'S'); 
INSERT INTO employees VALUES (12, 1, 'stapler2', 654, 'S'); 

SELECT employeeNumber, recordNumber, job, dept, type 
    FROM (SELECT employeeNumber, recordNumber, job, dept, type 
      , ROW_NUMBER() 
       OVER (PARTITION BY employeeNumber 
          ORDER BY type, recordNumber) rn 
      FROM employees) 
WHERE rn = 1; 

Урожайность это:

EMPLOYEENUMBER RECORDNUMBER JOB     DEPT TYPE 
-------------- ------------- -------------------- ----- ---- 
      12    1 stapler    788 S 
      18    2 phone cleaner   600 P 
      19    0 typist     400 S 
      21    0 mouse ball cleaner  400 P 

Использование RANK с этими данными даст 2 строки для сотрудника 12.Конечно, если этого не должно произойти, возможно, вы хотите, чтобы ваш запрос сообщал об этом факте.

Смежные вопросы