Random SQL Server中具有不同数量随机结果的随机联接
SQLServer的SQL变得非常聪明,看起来可能需要过程解决方案的事情通常可以用纯SQL来完成。我想知道这是不是其中的一次。 假设我们有一个州表和一个城市表Random SQL Server中具有不同数量随机结果的随机联接,random,sql-server-2012,top-n,Random,Sql Server 2012,Top N,SQLServer的SQL变得非常聪明,看起来可能需要过程解决方案的事情通常可以用纯SQL来完成。我想知道这是不是其中的一次。 假设我们有一个州表和一个城市表 STATES: State: NY CITIES State: NY City: Armonk 现在让我们用第三张表来把事情复杂化:说明 INSTRUCTIONS State: NY HowMany: 17 State: NJ HowMany: 11 在SQL Server SQL中,当三个表按状态连接时,是否有任何方法可以从
STATES:
State: NY
CITIES
State: NY
City: Armonk
现在让我们用第三张表来把事情复杂化:说明
INSTRUCTIONS
State: NY
HowMany: 17
State: NJ
HowMany: 11
在SQL Server SQL中,当三个表按状态连接时,是否有任何方法可以从cities表中随机选择多少个城市
我们事先不知道前N名。它随状态而变化
当然,States表将包含所有50个州,Cities表包含每个州的所有城市,指令将包含每个州的一条记录,确定需要从该州随机选择多少个城市 p.S.假设NY的指令为HowMany=5,NJ的指令为HowMany=4,并按状态排序,则示例所需结果。状态:
与使用不使用DDL数据定义语言的查询的另一个答案不同
SET @row_num2= 0;
SELECT *,@row_num2 := @row_num2+1 as rownum2 FROM (SELECT States.State,Cities.City,Instructions.HowMany
from States,Cities, Instructions
WHERE States.State = Cities.State and States.State = Instructions.State
ORDER BY RAND()) as t HAVING rownum2 >= t.HowMany
与使用不使用DDL数据定义语言的查询的另一个答案不同
SET @row_num2= 0;
SELECT *,@row_num2 := @row_num2+1 as rownum2 FROM (SELECT States.State,Cities.City,Instructions.HowMany
from States,Cities, Instructions
WHERE States.State = Cities.State and States.State = Instructions.State
ORDER BY RAND()) as t HAVING rownum2 >= t.HowMany
我发现其他答案中使用的RAND函数由于不是每行的新随机数而导致了一些问题 在这个场景中,CHECKSUMNEWID对我很有效。看 我认为这个解决方案很好,很整洁:
SELECT
RandomCities.[State]
,[RandomCities].City
FROM
(
SELECT
s.[state]
,city
,ROW_NUMBER() OVER (PARTITION BY s.[State] ORDER BY CHECKSUM(NEWID())) AS [RandomOrder]
FROM
States s
INNER JOIN Cities c ON c.[state]=s.[state]
) AS RandomCities
INNER JOIN instructions i ON i.[state]=RandomCities.[state]
WHERE RandomCities.RandomOrder<=i.HowMany
我发现其他答案中使用的RAND函数由于不是每行的新随机数而导致了一些问题 在这个场景中,CHECKSUMNEWID对我很有效。看 我认为这个解决方案很好,很整洁:
SELECT
RandomCities.[State]
,[RandomCities].City
FROM
(
SELECT
s.[state]
,city
,ROW_NUMBER() OVER (PARTITION BY s.[State] ORDER BY CHECKSUM(NEWID())) AS [RandomOrder]
FROM
States s
INNER JOIN Cities c ON c.[state]=s.[state]
) AS RandomCities
INNER JOIN instructions i ON i.[state]=RandomCities.[state]
WHERE RandomCities.RandomOrder<=i.HowMany
你能发布一个想要的结果样本吗?说明中每个州都有一条记录,那么为什么要使用两个表呢?有多少可以从指令移到状态表中。@Kjetil S.同意,但此时无需重构。您能发布一个示例所需结果吗?指令每个状态有一条记录,那么为什么要使用两个表呢?可以将多少指令移到状态表中。@Kjetil S.同意,但此时无需重构。错误:ORDER BY子句在视图、内联函数、派生表、子查询和公共表表达式中无效,除非还指定了TOP、OFFSET或FOR XML。错误:ORDER BY子句在视图中无效,内联函数、派生表、子查询和公共表表达式,除非还指定了TOP、OFFSET或FOR XML。