【问题标题】:Select Top rows and Order by NEWID() in DB2在 DB2 中选择 Top rows 和 Order by NEWID()
【发布时间】:2019-07-19 13:36:16
【问题描述】:

在 SQL Server 中,我有这个查询

SELECT TOP 10 * 
FROM xTable
ORDER BY NEWID()

基本上返回 10 个随机行。我也有由数字参数化的顶行,但这不是问题

我想在 DB2 查询中执行此操作,因为我必须使用 OpenQuery 从 DB2 获取数据并存储在本地临时表中,然后从中选择前 x 行。

如果我可以直接在 DB2 中实现这一点,那就太棒了,因为我必须获得超过一千行。

【问题讨论】:

标签: sql-server db2 db2-400


【解决方案1】:

排序不是一个好主意,尤其是对于大桌子。
我们能够使用subselect - tablesample-clause 的内置 Db2 for LUW 功能。

伯努利

BERNOULLI 抽样单独考虑每一行。它包括样本中的每一行,概率为 P/100(其中 P 是 numeric-expression1),并排除概率为 1 的每一行 - P/100,独立于其他行。所以如果数值表达式1 评估为值 10,代表 10% 的样本,每行 将以概率 0.1 包含,并以概率排除 0.9。

系统

SYSTEM 采样允许数据库管理器确定执行采样的最有效方式。大多数情况下, 应用于表名的 SYSTEM 采样意味着 表名以概率 P/100 包含在样本中,并且 以概率 1 - P/100 排除。每页上的所有行 包括有资格获得样品。

例子:

SELECT * 
FROM MYTABLE TABLESAMPLE SYSTEM (0.1) 
FETCH FIRST 10 ROWS ONLY;

DB2 for IBM i/iSeries/OS400 中不存在此功能。请改用此平台的 order by rand() fetch first 10 rows 子句。

【讨论】:

  • 我必须按顺序订购,因为我的要求之一是每次查询时都获得不重复的不同 x 行,这就是我至少在 sql 中所做的,但现在我正在尝试使用开放查询中的动态 sql,所以我可以只查询那些 X 行而不是获取所有数据。然而,这很高兴知道,因为我的同事都不熟悉 DB2 特性,除了简单的动态 sql 来获取原始数据
  • 我也只是想知道,因为我没有安装 DB2,也没有现在在办公室,所以我无法测试它。随机化是在限制行大小之后还是之前应用?
  • 当然是在限制之前应用随机化。
  • 有趣,我想我明天会尝试这个而不是 rand(),肯定会有很大的性能差异。非常感谢
  • 我提供的示例不适用于 DB2 for IBM i。我已在您的问题中添加了相应的标签。
【解决方案2】:

这是 DB2 LUW 还是 AS400?

试试

SELECT *
  FROM xTable
  ORDER BY ROW_NUMBER()
  FETCH FIRST 10 ROWS ONLY;

【讨论】:

  • 请注意,这**不会是“随机的”** - 查询将以某种未定义的顺序(可能是基表本身)遍历表并根据该顺序返回数字。后续运行可能(尽管不能保证)在每次运行查询时返回相同的行,这几乎可以肯定是不希望的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-18
  • 2011-09-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多