2017-01-17 9 views
2

Мне очень нужна ваша помощь. Мне нужно получить некоторые данные из таблицы SQL с определенным порядком. Все данные должны быть заказаны по KeyID по убыванию, но если в втором столбце будет некоторое количество строк с одинаковыми данными, они должны быть разделены другими строками.T-SQL ORDER По одной колонке со смешением другим

К примеру, у нас есть такая таблица:

KeyID UserID 
1   15 
2   17 
3   19 
4   19 
5   15 
6   17 
7   17 

В таблице результатов она должна быть

KeyID UserID 
7   17 
5   15 
6   17 
4   19 
2   17 
3   19 
1   15 

Есть ли способ сделать это?

ответ

1

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

order by row_number() over (partition by userId order by keyid desc), 
     keyid desc 
+0

это не совсем то, что мне нужно, но это лучший вариант – bimfh

0

Это должно работать для простого случая наличия не более 2 последовательных записей с общими UserID:

SELECT KeyID, UserID 
FROM (
    SELECT KeyID, UserID, 
      rn, COUNT(*) OVER (PARTITION BY UserID, grp ORDER BY KeyID DESC) AS rnk 
    FROM (
     SELECT KeyID, UserID, 
      ROW_NUMBER() OVER (ORDER BY KeyID DESC) AS rn, 
      ROW_NUMBER() OVER (ORDER BY KeyID DESC) - 
      ROW_NUMBER() OVER (PARTITION BY UserID 
           ORDER BY KeyID DESC) AS grp 
     FROM mytable) AS t) AS x 
ORDER BY rn + rnk, KeyID 
0

Этот нижеследующий запрос работает как ожидаемый результат.

WITH TEMP AS(
SELECT *, 
     ROW_NUMBER() OVER(PARTITION BY USERID ORDER BY KEYID DESC)ROW, 
     ROW_NUMBER()OVER(ORDER BY KEYID DESC)ROW1 
FROM USERS 
     ) 

SELECT KEYID,USERID 
FROM (
     SELECT KEYID,USERID,ROW1,ROW FROM TEMP 
     WHERE ROW<>2 
     UNION 
     SELECT KEYID,USERID,ROW1+1 ROW1, ROW FROM TEMP 
     WHERE ROW=2 
     )B 
ORDER BY ROW1 ASC 

Вот мой результат: enter image description here

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

  • Нет связанных вопросов^_^