2013-09-02 4 views
1

Есть ли способ в SQL Server ранжировать строки на основе значений в предложении WHERE?Рейтинг SQL Server Query results

Например:

SELECT * 
FROM Foo 
WHERE 
    Bar1 = true AND 
    Bar2 = true OR 
    Bar3 = false 

Лучший результат в этом случае будет строка, где Bar1 = верно, BAR2 = истинным и Bar3 = ложь. Строка, где Bar1 = true, Bar2 = true и Bar3 = true, будет меньше, потому что Bar3 отличается.

Сделать это еще сложнее. Предложение WHERE является динамическим, я точно не знаю, какие столбцы появятся в запросе. Таким образом, следующий запрос может быть:

SELECT * 
FROM Foo 
WHERE 
    Bar1 = false OR 
    Bar3 = true OR 
    Bar4 = True 

Как я могу применить ранжирование к этим запросам?

Можно ли это сделать в рамках запроса или лучше сделать это на C#?

+1

Вы Апи в 'WHERE', что значит вы хотите, чтобы исключить строки? Если да, то какие строки вы хотите сохранить и какие столбцы вы хотите группировать? Можете ли вы предоставить образцы данных и желаемый результат? –

ответ

1

Вы можете заказать результаты по количеству where положений, которые соответствуют:

order by ((case when Bar1 = true AND Bar2 = true then 1 else end) + 
      (case when Bar3 = false then 1 else 0 end) 
     ) desc 

Вы также можете добавить это поле в select. Если вы динамически создаете where, вам нужно будет сделать то же самое для переменной order by (или select).

Я бы посоветовал вам сделать это в базе данных, поскольку репликация логики между SQL и C# кажется кошмаром обслуживания.

0
WITH CTE 
    AS (SELECT T.*, 
       RN = ROW_NUMBER() 
         OVER ( 
         ORDER BY BAR1 ASC, BAR2 ASC, BAR3 DESC) 
     FROM DBO.TABLENAME T) 
SELECT * 
FROM CTE 
ORDER BY RN 
0

Вы можете дать каждой статье оценку 1, если она удовлетворена, и 0, если она не удовлетворена. И тогда вы можете заказать сумму баллов.

Что-то вроде:

SELECT * 
FROM Foo 
ORDER BY cast((Bar1 = true) as int) 
     + cast((Bar2 = true OR Bar3 = false) as int) 
DESC 
0

Не знаю, что вы имеете в виду true в SQL Server. Если вы Столбики разрядные столбцы, вы можете ранжировать следующим образом:

select * 
from Foo 
order by 
    case 
     when Bar1 = 1 and Bar2 = 1 and Bar3 = 0 then 0 
     else 1 
    end asc 

если это строки:

select * 
from Foo 
order by 
    case 
     when Bar1 = 'true' and Bar2 = 'true' and Bar3 = 'false' then 0 
     else 1 
    end asc