2015-01-21 8 views
2

Я использую SQL Server 2012.SQL Order сервера По GroupID случайны, но Asc ID в каждом GroupID

Я хочу установить порядковые номера в поле Num каждый раз, когда я исполняю SQL с правилами следующим образом:

  • Grp порядок для ранжирования.
  • ID поле для вознесения.

Может ли кто-нибудь пролить свет на меня?

ТАБЛИЦА

+-----+-----+----+ 
    | Num | Grp | ID | 
    +-----+-----+----+ 
    | 0 | 1 | 1 | 
    | 0 | 1 | 2 | 
    | 0 | 1 | 3 | 
    | 0 | 2 | 4 | 
    | 0 | 2 | 5 | 
    | 0 | 2 | 6 | 
    | 0 | 2 | 7 | 
    | 0 | 3 | 8 | 
    | 0 | 3 | 9 | 
    | 0 | 4 | 10 | 
    | 0 | 4 | 11 | 
    | 0 | 4 | 12 | 
    | 0 | 4 | 13 | 
    | 0 | 4 | 14 | 
    +-----+-----+----+ 

ЗАПЛАНИРОВАННЫЕ

+-----+-----+----+ 
    | Num | Grp | ID | 
    +-----+-----+----+ 
    | 1 | 3 | 8 | 
    | 2 | 3 | 9 | 
    | 3 | 1 | 1 | 
    | 4 | 1 | 2 | 
    | 5 | 1 | 3 | 
    | 6 | 4 | 10 | 
    | 7 | 4 | 11 | 
    | 8 | 4 | 12 | 
    | 9 | 4 | 13 | 
    | 10 | 4 | 14 | 
    | 11 | 2 | 4 | 
    | 12 | 2 | 5 | 
    | 13 | 2 | 6 | 
    | 14 | 2 | 7 | 
    +-----+-----+----+ 
+0

Что такое логика? Вы имеете в виду * odd * groups до * even * groups? –

+0

Я хочу, чтобы Grp-порядок был рандомизирован (но поле ID для подъема) каждый раз при выполнении SQL. – Hanericka

+0

Теперь ясно. –

ответ

1

ОБРАЗЕЦ ТАБЛИЦА

CREATE TABLE #TEMP(Num INT, Grp INT, ID INT) 

    INSERT INTO #TEMP 
    SELECT 0 , 1 , 1 
    UNION ALL 
    SELECT 0 , 1 , 2 
    UNION ALL 
    SELECT  0 , 1 , 3 
    UNION ALL 
    SELECT  0 , 2 , 4 
    UNION ALL 
    SELECT  0 , 2 , 5 
    UNION ALL 
    SELECT  0 , 2 , 6 
    UNION ALL 
    SELECT  0 , 2 , 7 
    UNION ALL 
    SELECT  0 , 3 , 8 
    UNION ALL 
    SELECT  0 , 3 , 9 
    UNION ALL 
    SELECT  0 , 4 , 10 
    UNION ALL 
    SELECT  0 , 4 , 11 
    UNION ALL 
    SELECT  0 , 4 , 12 
    UNION ALL 
    SELECT  0 , 4 , 13 
    UNION ALL 
    SELECT  0 , 4 , 14 

QUERY

;WITH CTE2 AS 
(
    -- Now GRP will be ordered in random order using NEWID() 
    SELECT ROW_NUMBER() OVER(ORDER BY NEWID()) RNO,GRP 
    FROM 
    (
     -- Select unique GRP's 
     SELECT DISTINCT GRP 
     FROM #TEMP 
    )TAB 

) 
SELECT ROW_NUMBER() OVER(ORDER BY rno,ID ASC) NUM, 
C2.GRP,C1.ID 
FROM CTE2 C2 
JOIN #TEMP C1 ON C2.GRP=C1.GRP 
order by rno,ID ASC 
  • Click here для просмотра результата

UPDATE

Вот запрос, чтобы обновить NUM поле в вашей таблице с новыми номерами строк.

;WITH CTE2 AS 
(
    SELECT ROW_NUMBER() OVER(ORDER BY NEWID()) RNO,GRP 
    FROM 
    (
     SELECT DISTINCT GRP 
     FROM #TEMP 
    )TAB 

) 
UPDATE #TEMP SET NUM = TAB.NUM 
FROM 
(
    SELECT ROW_NUMBER() OVER(ORDER BY rno,ID ASC) NUM, 
    C2.GRP,C1.ID 
    FROM CTE2 C2 
    JOIN #TEMP C1 ON C2.GRP=C1.GRP 
)TAB 
WHERE #TEMP.GRP=TAB.GRP AND #TEMP.ID=TAB.ID 


SELECT * FROM #TEMP 
order by NUM,ID ASC 
  • Click here для просмотра результата
+0

Неужели вы хотите обновить существующее поле в таблице с помощью нового Num? @Hanericka –

+0

Да, мне нужно поле Num, которое будет обновляться с последовательными номерами. Надеюсь, вы могли бы показать мне, как написать заявление об обновлении. – Hanericka

+0

Конечно. Будет обновлено @Hanericka –