интересный SQL-запрос со случайным - PullRequest
0 голосов
/ 22 февраля 2012

У меня есть таблица с 1000 строками со следующим шаблоном

id d1  date                        Type
   1  N   2012-03-09 00:00:00.000     C
   2  No  2011-09-26 00:00:00.000     C
   3  N   2012-01-26 00:00:00.000     R
   4  N   2012-03-07 00:00:00.000     R
   5  yes 2012-02-23 00:00:00.000     C
   6  N   2012-03-09 00:00:00.000     C
   7  No  2011-09-26 00:00:00.000     C
   8  N   2012-01-26 00:00:00.000     R
   9  N   2012-03-07 00:00:00.000     R
   10  yes 2012-02-23 00:00:00.000     C

Я хочу выложить, как показано ниже

id d1  date                        Type
   1  N   2012-03-09 00:00:00.000     C
   3  No  2011-09-26 00:00:00.000     R
   2  N   2012-01-26 00:00:00.000     C
   4  N   2012-03-07 00:00:00.000     R
   5  yes 2012-02-23 00:00:00.000     C
   8  N   2012-03-09 00:00:00.000     R
   7  No  2011-09-26 00:00:00.000     C
   9  N   2012-01-26 00:00:00.000     R
   6  N   2012-03-07 00:00:00.000     c
   10  yes 2012-02-23 00:00:00.000     R

Мне нужно показать 10 случайных строк, и этот порядок должен бытьна основе поля TYPE.и ПОЛЕ ТИПА должно иметь вид

c
r
c
r
c
r

.

Ответы [ 4 ]

4 голосов
/ 22 февраля 2012

Я решил это с помощью некоторых вызовов RAND (). Я пытался создать вычисляемые столбцы, но все вставки получали одинаковое значение. Значение было случайным от звонка к звонку, но то же самое в запросе. Каждый раз вставляя разные вызовы RAND (), я должен был повторить логику регистра для каждого значения, что было не совсем идеально. Вот как я решил это:

DECLARE @RandomizedTypes TABLE
(
    TempId FLOAT
    , d1 VARCHAR(3)
    , [Date] DATETIME
)

INSERT @RandomizedTypes
(
    TempId
    , d1
    , [Date]
)
VALUES
    (RAND(), 'N', '2012-03-09 00:00:00.000')
    , (RAND(), 'No', '2011-09-26 00:00:00.000')
    , (RAND(), 'N', '2012-01-26 00:00:00.000')
    , (RAND(), 'N', '2012-03-07 00:00:00.000')
    , (RAND(), 'yes', '2012-02-23 00:00:00.000')
    , (RAND(), 'N', '2012-03-09 00:00:00.000')
    , (RAND(), 'No', '2011-09-26 00:00:00.000')
    , (RAND(), 'N', '2012-01-26 00:00:00.000')
    , (RAND(), 'N', '2012-03-07 00:00:00.000')
    , (RAND(), 'yes', '2012-02-23 00:00:00.000')

DECLARE @FinalRandomizedTable TABLE
(
    id INT IDENTITY(1, 1)
    , d1 VARCHAR(3)
    , [Date] DATETIME
    , [Type] AS CASE WHEN (id % 2) = 0 THEN 'R' ELSE 'C' END
)

INSERT @FinalRandomizedTable
(
    d1
    , [Date]
)
SELECT
    d1
    , [Date]
FROM @RandomizedTypes
ORDER BY TempId

SELECT * FROM @FinalRandomizedTable

РЕДАКТИРОВАТЬ: Изменено для чередования строк 'R' и 'C' согласно обновленному вопросу.

1 голос
/ 23 февраля 2012

Вот один из способов:

SELECT t.id
       ,t.d1
       ,t.[date]
       ,t.[Type]
  FROM
    (
    -- Get 10 random rows
    SELECT TOP 10 id
           ,d1
           ,[date]
           ,[Type]
      FROM [table]
     ORDER BY NEWID() -- use NewID() to randomize result set
    ) t
     ORDER BY ROW_NUMBER() OVER (PARTITION BY t.[Type] ORDER BY t.id) ASC
     ,t.[Type] ASC
0 голосов
/ 08 января 2016
;with abcd
as
(
    select id, d1, date, types,
           ROW_NUMBER() over(partition by types order by types asc) as number 
    from sampledata 
)

select * from abcd order by number,types
0 голосов
/ 23 февраля 2012

Я думаю, это то, что вы хотите.

SELECT id,d1,date,Type
FROM (
select ((RANK() OVER ( ORDER BY randomRank)) * 2 + 1) rank, id,d1,date,Type
FROM (SELECT top 10 NEWID() randomRank,id,d1,date,Type FROM YourTable  WHERE Type = 'C' ORDER BY NEWID()) a
UNION 
select ((RANK() OVER ( ORDER BY randomRank)) * 2 ) rank, id,d1,date,Type
FROM (SELECT top 10 NEWID() randomRank,id,d1,date,Type FROM YourTable  WHERE Type = 'R' ORDER BY NEWID()) a
)b order by rank
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...