【问题标题】:Best way to randomly select rows *per* column in SQL Server在 SQL Server 中随机选择行*每*列的最佳方法
【发布时间】:2011-02-13 11:01:19
【问题描述】:

搜索 SO 会产生许多结果,这些结果描述了如何从数据库表中随机选择 数据。不过,我的要求有点不同,因为我想以最有效/随机/有趣的方式从随机行中选择单个

为了更好地说明:我有一个很大的客户表,我想从中生成一堆虚构的演示客户记录,这些记录不是真实的人。我正在考虑从客户表中随机查询,然后将名字与姓氏、地址、城市、州等随机配对。

如果这是我的真实客户数据(简化):

FirstName  LastName  State  
==========================
Sally      Simpson   SD
Will       Warren    WI    
Mike       Malone    MN
Kelly      Kline     KS

然后我会生成几条如下所示的记录:

FirstName  LastName  State  
==========================
Sally      Warren    MN
Kelly      Malone    SD

等等

我最初的方法是可行的,但它缺乏我希望最终答案提供的优雅。 (我对子查询的重复性特别不满意,而且该解决方案需要已知/固定数量的字段,因此不可重用。)

SELECT 
FirstName = (SELECT TOP 1 FirstName FROM Customer ORDER BY newid()),
LastName= (SELECT TOP 1 LastNameFROM Customer ORDER BY newid()),
State = (SELECT TOP 1 State FROM Customer ORDER BY newid())

谢谢!

【问题讨论】:

  • 如果你说你想从你的表中选择一个随机列,对我来说,你似乎想进行查询,但不知道结果是州、名字还是姓氏。我不知道该怎么做,但这似乎也不是你想要的。您似乎确实想要选择随机行。您只希望每列有一个不同的随机行。很抱歉,除了建议您澄清您的问题之外,我无能为力。
  • 我认为你们(两人)是对的,因为我真的不想要随机列。这个概念很简单(如我的示例表和示例结果所示),但措辞让我无法理解。 “随机重新排序表的各个列”怎么样?找到最佳措辞后,我将编辑问题...
  • 实际上新编辑的标题看起来很完美——谢谢

标签: sql sql-server tsql


【解决方案1】:

ORDER BY NEWID() 适用于 SQL Server 2008 中的 ROW_NUMBER。不确定 SQL Server 2005,

这是生成值以连接 3 个单独的查询所必需的:这有点违反直觉,因为您认为它总是会以不同的顺序获取前 100 行,但事实并非如此......

;With F AS
(
  SELECT TOP 100
    FirstName, ROW_NUMBER() OVER (ORDER BY NEWID()) AS Foo
  FROM Customer
), L AS
(
  SELECT TOP 100
    LastName, ROW_NUMBER() OVER (ORDER BY NEWID()) AS Foo
  FROM Customer
), S AS
(
  SELECT TOP 100
    State, ROW_NUMBER() OVER (ORDER BY NEWID()) AS Foo
  FROM Customer
)
SELECT
   F.FirstName, L.LastName, S.State
FROM
   F
   JOIN L ON F.Foo = L.Foo
   JOIN S ON F.Foo = S.Foo

【讨论】:

    【解决方案2】:

    在我看来,您实际上是在尝试生成随机数据——您已经拥有一堆非随机数据这一事实实际上只是一个旁注。如果我站在你的立场上,我会考虑通过从字典中选择随机词用作 FName、LName、City 等来生成随机客户。无论如何,这似乎更容易且更随机。

    【讨论】:

    • 谢谢 - 这确实会解决“随机问题”问题。这是一个样本报告,所以我认为名为 Mr. Pogostick Zucchini 的客户不合适。我想我想要的是随机的客户数据,用一种更好的方式。这是我原帖的不足之处,抱歉。
    【解决方案3】:

    您可以一次选择前 N 个随机行(其中 N=3 是列数),然后从第 1 行中取出第 1 列,从第 2 行中取出第 2 列,等等。我不确定如何用 SQL 做最后一步,但如果你愿意用其他语言做最后一步,我相信它会很简单。

    此外,通过一次选择 N 行,您将拥有永远不会从同一行中选择两列的新属性(尽管如果列多于行,这可能会导致问题)。

    【讨论】:

    • +1 我喜欢额外的保证,即没有真正的名字/姓氏会与这种技术配对。
    猜你喜欢
    • 2012-01-30
    • 2012-04-15
    • 1970-01-01
    • 1970-01-01
    • 2018-12-04
    • 2010-09-13
    • 1970-01-01
    • 2017-12-16
    • 2010-10-25
    相关资源
    最近更新 更多