【问题标题】:Select N random rows in group选择组中的 N 个随机行
【发布时间】:2014-01-09 08:22:44
【问题描述】:

请注意以下获取 12 行随机行的 SQL 查询。

SELECT TOP 12 ExportSystem.sysID, ExportSystem.sysNo, ExportSystem.sysName, Document.docArchiveNo FROM ExportSystem
INNER JOIN Customer ON ExportSystem.sysNo = Customer.expSysNr
INNER JOIN Department ON Customer.cusID = Department.cusID
INNER JOIN Level ON Level.levParentID = Department.levRootID
INNER JOIN Document ON Document.levID = Level.levID
GROUP BY ExportSystem.sysID, ExportSystem.sysNo, ExportSystem.sysName, Document.docArchiveNo
ORDER BY newid()

结果

SystemName  ArchiveNo
RR  31676981
AA  28741154
AA  30435868
AA  29665408
AA 28116900
BB  31114199
RR  29080695
AA  29903701
VV  31890130
BB  29898481
BB  30892927
AA  30545346

我尝试了很多方法,但还没有弄清楚如何为每个组获得相同数量的行。目前有2个RR,6个AA,3个BB,1个VV。如何在每个 SystemName 组中获取 4 行。

【问题讨论】:

  • 一个想法是从每个组中分别选择4个随机行,然后进行联合。

标签: sql sql-server


【解决方案1】:

您可以使用排名函数ROW_NUMBERPARTITION BY Systemname 来做到这一点:

WITH CTE
AS
(
   SELECT 
     ExportSystem.sysID, 
     ExportSystem.sysNo, 
     ExportSystem.sysName, 
     Document.docArchiveNo,
     ROW_NUMBER() OVER(PARTITION BY ExportSystem.sysName 
                       ORDER BY newid()) AS RN 
  FROM ExportSystem
  INNER JOIN Customer   ON ExportSystem.sysNo = Customer.expSysNr
  INNER JOIN Department ON Customer.cusID     = Department.cusID
  INNER JOIN Level      ON Level.levParentID  = Department.levRootID
  INNER JOIN Document   ON Document.levID     = Level.levID
)
SELECT 
  sysID, 
  sysNo, 
  sysName, 
  docArchiveNo
FROM CTE
WHERE RN <= 4;

注意:在你原来的查询中选择GROUP BY中相同的列是没有用的,没有必要使用GROUP BY。删除它并改用DISTINCT,.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-03
    • 2017-01-13
    • 1970-01-01
    • 2019-12-02
    • 2021-08-12
    • 1970-01-01
    • 1970-01-01
    • 2010-10-25
    相关资源
    最近更新 更多