SQL Server Row_number в ORDER BY CASE - PullRequest
       38

SQL Server Row_number в ORDER BY CASE

0 голосов
/ 05 июня 2018

РЕДАКТИРОВАНИЕ ВСЕЙ ТЕМЫ.

Мне нужно создать представление для сортировки статьи по типу.

  1. Если у меня есть только тип: * VALUE -> Мне нужно показатьтолько эта строка.
  2. Если у меня есть тип: * VALUE & 2 -> По-прежнему отображается строка, соответствующая только * типу VALUE.
  3. Если у меня есть только тип: 2 -> Показывает этот.

Я уже сделал нечто подобное:

VALUE * - это значение, которое должно прийти из другой таблицы с объединением.

SELECT Id_item ,Name_item , Type_item , Id_type_item FROM ITEM WHERE Name_item = 'Gillette' AND (Id_Type_item = VALUE* OR Id_Type_item ='10')<br> ORDER BY CASE WHEN row_number() OVER(ORDER BY Id_item DESC , Id_Type_Item DESC) <= 1 THEN 0 ELSE 1 END;

Но это происходит в случае, когда у нас есть оба ряда для типов (* VALUE & 10):

Id_item / Name_item / Type_item / Id_Type_Item
1       Gillette    45            30 (*VALUE)
1       Gillette    2             10

Так что я думаю, что порядок по Over () может быть полезен длявсегда сортировать по * VALUE (в действительности это другой столбец из другой таблицы)

Я всегда хочу выбирать только 1 строку данных!:)

Ответы [ 3 ]

0 голосов
/ 05 июня 2018

Вот возможное решение.В этом случае ROW_NUMBER, RANK и DENSE_RANK будут работать.Однако ROW_COUNT не является допустимой оконной функцией на сервере sql.

DECLARE @A TABLE(ID INT, Value INT)
DECLARE @B TABLE(ID INT,Value INT)
INSERT INTO @A VALUES (1,1),(2,1),(3,2),(4,3),(5,2),(6,1),(7,3)
INSERT INTO @B VALUES (1,1),(2,1),(3,1),(4,2),(5,3),(6,2),(7,1),(8,3)

;WITH D AS
(
    SELECT ID,Value FROM @A WHERE Value IN(1,2)
    UNION ALL
    SELECT ID,Value FROM @B WHERE Value IN (3)
 )
SELECT * FROM
(
    SELECT
      ID, Value,
      ValueRankInSet = DENSE_RANK() OVER(PARTITION BY VALUE ORDER BY ID) -- <-- If you do not have an ID field you can subst ID with NEWID() as order is not important 
    FROM D
)AS X
WHERE ValueRankInSet = 1
0 голосов
/ 05 июня 2018

Присвойте приоритет в пределах ваших Выборов, а затем упорядочите их по номеру строки:

with cte as 
 (
    SELECT *,
       row_number()
       over (-- partition by ??? 
             order by prio) as Position
    FROM 
    (
    SELECT 1 as prio, * FROM A WHERE var = 1
    UNION -- probably a more efficient UNION ALL
    SELECT 2 as prio, * FROM A WHERE var = 2
    UNION -- probably a more efficient UNION ALL
    SELECT 3 as prio, * FROM B WHERE var = 3
    )
 )
select *
from cte
WHERE Position = 1
0 голосов
/ 05 июня 2018

Я предполагаю, что вы хотите, чтобы "первая" строка возвращалась из каждого SELECT?Нет необходимости использовать отдельный оператор SELECT для каждой переменной в одной и той же таблице, для этого можно использовать оконную функцию.Я считаю, что это то, что вы можете после.

WITH CTE AS(
    --The following assumes table A and B have the same DDL (which begs the question, why are they different tables?)
    SELECT *,
           ROW_NUMBER() OVER (PARTITION BY var
                              ORDER BY (SELECT NULL)) AS RN --Replace SELECT(NULL) with your actual ordering criteria
    FROM A
    WHERE var IN (1,2)
    UNION --ALL(?)
    SELECT *
           ROW_NUMBER() OVER (PARTITION BY var
                              ORDER BY (SELECT NULL)) AS RN --Replace SELECT(NULL) with your actual ordering criteria
    FROM B
    WHERE var IN (3))
SELECT *
FROM CTE
WHERE RN = 1;
...