2014-01-07 2 views
4
select * from MYTABLE t 
where EQUIPMENT = 'KEYBOARD' and ROWNUM <= 2 or 
EQUIPMENT = 'MOUSE' and ROWNUM <= 2 or 
EQUIPMENT = 'MONITOR' and ROWNUM <= 2; 

Я пытаюсь запустить запрос, который возвращает совпадения в поле (т.е. оборудование) и ограничивает вывод каждого типа оборудования на 2 записи или меньше на тип оборудования. Я знаю, что это, вероятно, не лучший способ используйте несколько аргументов where, но я использовал это в прошлом, разделенном или операторами, но не работает с rownum. Кажется, он возвращает только последнее утверждение. спасибо заранее.SQL Oracle rownum on multiple where clauses?

ответ

5
WITH numbered_equipment AS (
    SELECT t.*, 
     ROW_NUMBER() OVER(PARTITION BY EQUIPMENT ORDER BY NULL) AS row_num 
    FROM MYTABLE t 
    WHERE EQUIPMENT IN ('KEYBOARD', 'MOUSE', 'MONITOR') 
) 
SELECT * 
FROM numbered_equipment 
WHERE row_num <= 2; 

SQLFIDDLE

Если вы хотите определить приоритеты, какие строки выбираются на основе других столбцов затем изменить ORDER BY NULL часть запроса поставить самый высокий приоритетные элементы сначала в порядке.

Редактировать

Чтобы просто вытащить строки, в которых оборудование спичек и статус активен, то используйте:

WITH numbered_equipment AS (
    SELECT t.*, 
     ROW_NUMBER() OVER(PARTITION BY EQUIPMENT ORDER BY NULL) AS row_num 
    FROM MYTABLE t 
    WHERE EQUIPMENT IN ('KEYBOARD', 'MOUSE', 'MONITOR') 
    AND STATUS = 'Active' 
) 
SELECT * 
FROM numbered_equipment 
WHERE row_num <= 2; 

SQLFIDDLE

+0

Вы правы! .. Это должен быть правильный способ сделать это. +1 –

+0

Спасибо! это работает. Как бы я также указал для каждой записи в этом запросе, что вы предоставили (status = 'ACTIVE')? просто добавьте (и статус = 'ACTIVE') рядом с (WHERE row_num <= 2) еще раз спасибо! EDIT: Я бы хотел, чтобы он отобрал не более двух активов, которые активны, а не фильтруют результаты, после которых могут включать неактивные. надеюсь, что имеет смысл. – emvee

+0

Nevermind я получил работу над активными активами, поставив: WHERE STATUS = 'A' и EQUIPMENT IN ...... – emvee

4

Количество строк может быть специфическим для каждого Оборудование type!

SELECT * FROM MYTABLE t 
where EQUIPMENT = 'KEYBOARD' and ROWNUM <= 2 
UNION ALL 
SELECT * FROM MYTABLE t 
WHERE EQUIPMENT = 'MOUSE' and ROWNUM <= 2 
UNION ALL 
SELECT * FROM MYTABLE t 
WHERE EQUIPMENT = 'MONITOR' and ROWNUM <= 2; 
1

Попробуйте это:

select * from (
    select * from MYTABLE t where EQUIPMENT = 'KEYBOARD' and ROWNUM <= 2 
    union 
    select * from MYTABLE t where EQUIPMENT = 'MOUSE' and ROWNUM <= 2 
    union 
    select * from MYTABLE t where EQUIPMENT = 'MONITOR' and ROWNUM <= 2) 
+0

Это делает не возвращать две строки на оборудование nt - он возвращает только две строки. – MT0

+0

Нет, если вы хотите не более двух строк PER EQUIPMENT TYPE, тогда вы не хотите увеличивать 'ROWNUM', так как тогда вы можете получить четыре клавиатуры, а не две клавиатуры и две мыши. – MT0

1

попробовать:

select * from MYTABLE t where EQUIPMENT = 'KEYBOARD' and ROWNUM <= 2 
union 
select * from MYTABLE t where EQUIPMENT = 'MOUSE' and ROWNUM <= 2 
union 
select * from MYTABLE t where EQUIPMENT = 'MONITOR' and ROWNUM <= 2