2016-12-23 4 views
0

Я хочу выбрать последние записи из БД в SQL Server. Если только один пункт выбран окончательный вывод таков:SELECT TOP с несколькими UNION и с ORDER BY

SELECT TOP(10) * from dbo.Eventos WHERE Tipo LIKE '%OS%' AND Distrito LIKE '%' 

+ всегда добавляется в конце:

ORDER BY Data DESC 

ПРИМЕЧАНИЕ: Distrito LIKE '%' должен остаться, как это иногда программно изменено на что-то кроме %.

Если имеется больше элементов, запрос получает один UNION линия добавлена ​​программно для каждого элемента. В конце, как всегда, добавляется ORDER BY. Пример со всеми 4 товаров проверен:

SELECT TOP(10) * from dbo.Eventos WHERE Tipo LIKE '%OS%' AND Distrito LIKE '%' 
UNION ALL SELECT TOP(10) * from dbo.Eventos WHERE Tipo LIKE '%Rad%' AND Distrito LIKE '%' 
UNION ALL SELECT TOP(10) * from dbo.Eventos WHERE Tipo LIKE '%Aci%' AND Distrito LIKE '%' 
UNION ALL SELECT TOP(10) * from dbo.Eventos WHERE Tipo LIKE '%Out%' AND Distrito LIKE '%' 
ORDER BY Data DESC 

Но это дает мне 10 самому старые результаты для каждого WHERE пункта отсортированных BY Data DESC.

Как я могу получить NEWEST X результатов по каждому товару (WHERE)?

+0

Это действительно похоже на SQL-сервер, а не на mySQL. Вы уверены, что ваш тег правильный? – xQbert

ответ

0

Если я правильно понял, вы хотите, чтобы 10 последних событий для каждого типа были такими, как os, rad, aci, out. Вы определяете самое последнее, просматривая данные (я предполагаю, что это поле даты). Мы можем выполнить это, используя раздел ROW_NUMBER с помощью tipo без всех союзов. но поскольку у нас есть дикие карты для tipo, нам нужно определить их в один и тот же набор; что может быть сделано с помощью оператора case в функции окна.

Я предполагаю, что Distrito будет иметь одинаковую ценность для каждого типо при заселении.

WITH CTE AS (
    SELECT E.*, Row_number() over (partition by 
     CASE WHEN Tipo LIKE '%OS%' then 'OS' 
      WHEN Tipo like '%Rad%' then 'Rad' 
      WHEN Tipo LIKE '%Aci%' then 'ACI' 
      WHEN tipo LIKE '%Out%' then 'OUT' end order by data Desc) RN 
    FROM dbo.Eventos E 
    WHERE (Tipo LIKE '%OS%' OR Tipo LIKE '%Rad%' OR Tipo LIKE '%Aci%' OR Tipo LIKE '%Out%') 
     AND Distrito like '%') 
SELECT * 
FROM cte 
WHERE RN <=10; 

Мы используем общий стол Выражение (КТР), потому что нам нужны результаты, которые будут созданы для rownumbers, прежде чем мы можем ограничить их. Поскольку row_number будет перезагружаться для каждого другого tipo, нам просто нужно получить те < = 10, чтобы заменить ваш верх.

Или просто построить на том, что вы сделали ...

SELECT * FROM (
    SELECT * FROM 
    (SELECT TOP(10) * from dbo.Eventos WHERE Tipo LIKE '%OS%' AND Distrito LIKE '%' ORDER BY DATA desc) A 
    UNION ALL 
    SELECT * FROM 
    (SELECT TOP(10) * from dbo.Eventos WHERE Tipo LIKE '%Rad%' AND Distrito LIKE '%' ORDER BY DATA DESC) B 
    UNION ALL 
    SELECT * FROM 
    (SELECT TOP(10) * from dbo.Eventos WHERE Tipo LIKE '%Aci%' AND Distrito LIKE '%' ORDER BY DATA DESC) C 
    UNION ALL 
    SELECT * FROM 
    (SELECT TOP(10) * from dbo.Eventos WHERE Tipo LIKE '%Out%' AND Distrito LIKE '%' ORDER BY Data DESC) D 
) E 
ORDER BY DATA DESC; 

Вам нужно подзапросы, чтобы иметь свой собственный порядок на, чтобы получить правильный топ-10 для каждого типо группировки. Для этого вам нужно, чтобы каждый запрос выполнял роль встроенного представления и полностью материализовывался (фактически генерировал данные) до того, как произойдет объединение.

+0

Ваше первое решение дает мне «Неправильный синтаксис рядом с« Row_number ». Ваше второе решение также не работает (3 'Неверный синтаксис рядом с ошибками ключевого слова ORDER', строки 5, 7 и 9), но, похоже, больше мне нужно (не забывайте, что дополнительный SELECT (UNION) добавляется программно. Я обновил свой вопрос для уточнения. – Dillinger

+1

1-го не было запятой между E. * и row_number. Второй нужно было добавить несколько избранных и некоторые(). При повторении во втором решении вы можете понять, почему я найти 1-й более элегантный. – xQbert

+0

1-й вариант менее прост для реализации программно, чем 2-е решение, которое работало точно так, как я хотел. – Dillinger

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