在sql server中随机记录和顺序记录

时间:2015-10-22 12:47:08

标签: sql sql-server sql-server-2012 shuffle

我编写了一个SQL查询,它使用NEWID()返回一个随机数据 在SQL Server 2012中。

方案: 我有一个表格,我们在表格中有问题 - “tblquest”,而在“tblquestLinked”表中,我们有一个链接问题,与“tblquest”表中的主要问题有关, 现在,下面的查询正确输出了混洗数据。

select ROW_NUMBER() Over (Order by newid()) as sNo,*
from (select q.ID AS [QID], q.Question,
q.Solution,
isnull(q.IsLinked,0) as IsLinked, ql.LinkQuestion
from tblquest q
left join tblQuestLinked ql
on q.ID = ql.QID) a

publicly-available

我希望查询返回的数据集中也应该有一个链接的问题,但不应该被洗牌,而应该是下一行链接“主”问题。

修改

由于这些问题将提交给在线考试申请,因此必须改变问题。

一个主要问题可以包含0到多个链接问题。 并且链接的问题出现在相应的“主要”问题的下一行。 因为这将传递给UI,它将提供基于sNO(序列号)

的问题

请找到截图(所需结果):

enter image description here

架构脚本:

CREATE TABLE [dbo].[tblQuest](
[ID] [int] IDENTITY(1,1) NOT NULL,
[IsLinked] [bit] NULL,
[Question] [nvarchar](500) NULL,
[Solution] [nvarchar](500) NULL,
CONSTRAINT [PK_tblQuest] PRIMARY KEY CLUSTERED 
(
[ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF,        ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
)
GO

CREATE TABLE [dbo].[tblQuestLinked](
[ID] [int] IDENTITY(1,1) NOT NULL,
[QID] [int] NULL,
[LinkQuestion] [nvarchar](max) NULL,
[CreatedDate] [datetime] NULL,
 CONSTRAINT [PK_tblQuestLinked] PRIMARY KEY CLUSTERED 
(
[ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF,    ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
)
GO


INSERT [dbo].[tblQuest] ([IsLinked], [Question], [Solution]) VALUES (0, N'Which of ... 1 ', 'Solution 1 ... ')
INSERT [dbo].[tblQuest] ([IsLinked], [Question], [Solution]) VALUES (0, N'Which of ... 2 ', 'Solution 2 ... ')
INSERT [dbo].[tblQuest] ([IsLinked], [Question], [Solution]) VALUES (0, N'Which of ... 3 ', 'Solution 3 ... ')
INSERT [dbo].[tblQuest] ([IsLinked], [Question], [Solution]) VALUES (0, N'Which of ... 4 ', 'Solution 4 ... ')
INSERT [dbo].[tblQuest] ([IsLinked], [Question], [Solution]) VALUES (0, N'Which of ... 5 ', 'Solution 5 ... ')
INSERT [dbo].[tblQuest] ([IsLinked], [Question], [Solution]) VALUES (0, N'Which of ... 6 ', 'Solution 6 ... ')
INSERT [dbo].[tblQuest] ([IsLinked], [Question], [Solution]) VALUES (1, N'Which of ... 7 ', 'Solution 7 ... ')


INSERT [dbo].[tblQuestLinked] ( [QID], [LinkQuestion]) VALUES (7, N'LINKED Q : SUB LINKED')

2 个答案:

答案 0 :(得分:3)

如果我理解正确,您希望链接的问题始终在主要问题之下。这是一种方法:

raw_input

SQL Fiddle

中的示例

答案 1 :(得分:0)

假设没有根问题就没有任何链接问题,您只需从两个表中选择所有记录并将其与UNION ALL粘合在一起。然后我们首先想要基于它们共有的ID的排序顺序。但只是按qid排序,newid()实际上会按ID排序,而不是随机排序。所以我们需要一个随机函数来获取ID并给我们一个确定性的"随机"基于它的价值:RAND(qid)。但是,这仍然会在每次执行时给出相同的顺序,因此我们添加了一个随机函数:

<击>

ORDER BY rand(rand(convert(int, getdate())) - qid)

它表明SQL Server的RAND在播种方面有点瑕疵(请参阅我对此的评论)。这对我有用:

ORDER BY rand((datepart(mm, getdate()) * 100000) +
              (datepart(ss, getdate()) * 1000) +
               datepart(ms, getdate()) ^ qid)

由于两个不同的种子仍然可以导致相同的随机数,我们需要向此添加, qid,以确保两个链接的条目聚集在一起。此外,我们添加, islinked desc以便在链接问题之前获得问题。

整个查询:

select qid, question, solution, islinked
from
(
  select 
    id as qid, 
    question,
    solution,
    isnull(islinked, 0) as islinked, 
    id as linkkey
  from tblquest
  union all
  select 
    id as qid, 
    linkquestion as question,
    null as solution,
    0 as islinked, 
    qid as linkkey
  from tblquestlinked
) both
order by rand((datepart(mm, getdate()) * 100000) +
              (datepart(ss, getdate()) * 1000) +
               datepart(ms, getdate()) ^ qid), qid, islinked desc;

SQL小提琴:http://sqlfiddle.com/#!3/476fd/2