问题标签 [analytic-functions]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
14573 浏览

sql - Oracle MIN 作为分析函数 - ORDER BY 的奇怪行为?

这个特殊情况是从一个例子中提炼出来的,在这个例子中,程序员假设将两批货物装入一辆油罐车,第 1 行将首先装载。我更正了这一点以允许以任何顺序执行加载 - 但是,我发现它MIN() OVER (PARTITION BY)允许ORDER BY在 Oracle 中(这在 SQL Server 中是不允许的),此外,它改变了函数的行为,导致ORDER BY显然是添加到PARTITION BY.

一个 SQL Server 示例(注释掉了不适用的代码):

所以问题是:甲骨文在做什么,为什么这样做,是否正确?

0 投票
5 回答
3600 浏览

oracle - 使用 Oracle 查找任意日期范围内的行数

我需要回答的问题是“我们在 60 分钟内收到的最大页面请求数是多少?”

我有一个看起来与此类似的表:

我正在寻找任何 60 分钟时间片中的最大行数。

我认为分析函数可能会让我到达那里,但到目前为止我还处于空白状态。

我想要一个正确方向的指针。

0 投票
1 回答
4863 浏览

sql - SQL Server ROW_NUMBER() 在哪些情况下不是从 1 开始?

我们ROW_NUMBER()在查询中使用。它在几乎所有情况下都返回正确的结果。但是对于 1 个用户,它的行为非常不同。

当页面大小设置为 50 时,该查询对该用户运行良好。但是当页面大小设置为 100 时,我们观察到它没有返回所有行。它只返回 10 行。即使有超过 100 个结果满足条件。请找到以下无法正常工作的查询。

当试图验证原因时,我们观察到第二个查询返回的 RN 值大于 100。它不是从 1 开始的。

有人可以解释这种行为的可能原因。语法中是否有任何需要修改的内容,或者 SQL Server 中是否需要更改任何设置以使row_number()函数值从 1 开始?

0 投票
2 回答
862 浏览

oracle - 有趣的 Oracle 分析查询挑战

我对 Oracle 分析功能相当有经验,但这个让我很难过。如果有明显的解决方案,我会踢自己:)

我有一个表 JOURNAL,它在另一个表上记录插入、更新和删除。

它作为日记帐的表是 BOND_PAYMENTS,它表示 PAYMENTS 和 BONDS 之间的链接;它存储从特定付款(由 PAYMENT_ID 标识)分配给特定债券(由 BOND_NUMBER 标识)的金额(AMOUNT)。此外,它还记录了它被分配给 (BOP_DOMAIN) 的债券的哪个方面,可能是“BON”、“PET”或其他代码。BOND_PAYMENTS 表有一个代理键 (BOP_ID)。

因此,对于每个 BOP_ID,我的日志表通常会有 1 条或多条记录——首先是一个 INSert,然后可能是一些 UPDates,然后可能是一个 DELete。

这是期刊表:

以下是一些示例数据:

现在,我需要从该日记帐表中提取一整套数据,但格式略有不同。主要要求是我们不再希望日志表记录 BOP_DOMAIN - 它只是不需要。

我需要为每条 BOND_PAYMENT 记录生成总金额的历史记录。我不能使用 BOND_PAYMENT 表本身,因为它只显示每条记录的最新状态。我需要从期刊中挖掘这些信息。

我不能只接受一个SUM(amount) over(partition by payment_id, bond_number),因为一个单独的 BOP_ID 可能会更新多次;因此,在任何一个时刻,都应该使用为该 BOP_ID 记录的最新金额。

鉴于上述示例数据,这是我期望产生的说明:

样本数据和预期结果

在这里,我在左侧复制了示例数据,用于两个示例付款。在右边我有“Running Total”,这是预期的输出。旁边(红色)是它如何计算每一行的运行总计的逻辑。

“运行总计”是 PAYMENT_ID 和 BOND_NUMBER 组合的总金额在日记帐分录时间点的快照。请记住,一个特定的 BOP_ID 可能会被更新多次;总金额必须只考虑该 BOP_ID 的最新记录。

任何可行的解决方案都是可以接受的,但我怀疑分析函数(或分析函数的组合)将是解决这个问题的最佳方法。

0 投票
2 回答
164 浏览

sql - 无法从 sql 查询中检索所需数据

在这里,现有查询的工​​作方式如下。

假设公司正在分配 1000 只基金,其中每只基金的价格为 2。

现在这 1000 笔资金分配给 4 名员工。

基本问题是为一名员工检索资金的最大值。假设资金分配为:

因此,这里给一名员工的最大资金价值 = 600。

我现在可以通过查询检索。

但是,现在下一个问题是检索另一列 ( emp_count_with_max_value),该列应该是每个组下授予此最大值的员工数量。

在我们的示例中,结果是 3 名员工。但我无法检索相同的

在这里,我只给出了一组数据。结果查询输出应如下所示:

0 投票
4 回答
2041 浏览

oracle - ORA-00907 在查询中使用分析函数时出错 (PS/Query, Peopletools 8.51.12)

当我尝试将值列表粘贴到条件中时,查询会引发 ORA-00907 错误。

背景我不是开发人员,我只是一个经过充分研究的最终用户,我可以在 Peoplesoft 中使用 PS/Query 编写查询,以用于我公司的实施。我使用 Peoplesoft 的 FSCM 模块(财务和供应链管理),目前版本为 FSCM 8.90.08.024,我认为使用 Oracle 11g 作为基础数据库。

我主要是自学成才,我们的技术专家忙于数据库/应用程序的东西,或者他们不熟悉我部门的特定数据需求。

我应该指出,我无法直接编写 SQL 语句来查询数据库。我必须使用一个名为“PS/Query”(也称为查询管理器)的内置程序和一个 GUI,它为您编写 SQL 并将其保存为一个查询,您可以运行到数据库以提取数据。这仅与我的问题有关:

PS/Query 是我迄今为止唯一的 SQL 经验,除了 Oracle 的文档和类似这样的网站。根据我的研究,“实际的”SQL 程序员认为它非常受限。对它的限制要求您以违反 SQL 编码最佳实践的方式做事。

查询请求:我有一个查询,我被要求写出针对某些系统定义的类别代码的支出(在凭证和采购订单上)。我要做的是提取凭证 ID,按供应商和类别代码对它们的商品金额求和,然后显示结果。或者换句话说,对于供应商/类别的每个独特组合,将具有该供应商/类别组合的所有优惠券金额相加。

使用 SUM (Fieldname) OVER (PARTITION BY fieldname, fieldname) 语法。

所以最终结果应该看起来像......

话虽如此,这里是查询管理器显示的 SQL 以获得我上面显示的结果集:

潜在问题:这工作正常,但一次只能提示一个类别代码。类别代码是 5 位数字,一个 3 位数字的“类别”,后跟一个短划线,然后是一个 2 位数字的“子类别”。我有一个包含 375 个类别代码的列表,我需要获取此查询结果。

我已经在这个版本上设置了一个提示,允许输入通配符(所以 123-%%),但这仍然是大约一百次单独运行的查询。查询管理器允许在条件中使用“列表中”表达式类型,但它需要您手动输入列表中的每个条目。

我正在尝试将其设置为可以将代码列表的纯文本副本粘贴到表达式中的位置,并带有适当的引号/逗号,并让它评估它以给我一个指定的所有 NIGP 代码的组合列表。查询管理器创建的提示字段不允许粘贴列表(据我所知)。

尝试的解决方案:我查看了位于http://peoplesoft.ittoolbox.com/groups/technical-functional/peoplesoft-other-l/create-an-expression-in-psoft-90-query-to-paste-a-的页面list-of-emplids-2808427并且我已经尝试了那里给出的一些答案,但没有一个有效。该页面导致我尝试使用此修改后的 SQL(显然代码列表被截断了一点以便在此处显示):

上面的 SQL 是给我 ORA-00907 错误的原因。有没有人遇到过这个问题?巨大的文字墙,我知道。我很抱歉。这是我在这里的第一篇文章,我尽量不遗漏任何相关内容。

我已经解决了引发这个问题的直接问题,但该请求只是一个非常大的冰山一角,在某些时候我需要找出一种方法,能够使用查询管理器将纯文本列表粘贴为标准,最好是与分析分组配合得很好。

TL;DR 版本:

使用 Peoplesoft 查询管理器使用 OVER、PARTITION BY 进行分组分析 SUM。当我尝试将列表粘贴到条件中时,它会引发 ORA-00907 错误。

任何帮助将不胜感激。谢谢!

0 投票
1 回答
3410 浏览

sql - oracle中的dense_rank()解析函数

此查询不起作用,因为Sal应该在 group by 子句中。谁能解释为什么会这样,是否有任何替代方法可以在不更改 group by 子句的情况下在同一选择中获得排名?您只想根据薪水排序。

编辑
假设emp表中有另一个列名commision,我必须按deptno分组,commision和分区仅按deptno,那么建议的答案是什么:

现在我如何按 depno 和佣金分组,只按 deptno 分区。

我如何在不同的列上分组并根据不同列上的分区查找排名

0 投票
7 回答
199576 浏览

oracle - 以最大日期记录

假设我提取了一组数据。

IE

我只想要具有最大日期的记录(对于 A 的每个值)。我可以写

但是我的查询真的很长......有没有更紧凑的方式使用 ANALYTIC FUNCTION 来做同样的事情?

0 投票
2 回答
1489 浏览

sql - 仅当结果中有多行时才获取数据

假设我有一个包含、和abc列的表。仅当特定值有多行时,我才想从该表中获取数据(表中对于我要忽略的每个“垃圾”数据都有一行)。如何构造我的查询,以便我可以确定 a 是否有多行而不从游标中获取数据。p_idu_idcommentsp_idp_idp_id

目前,我的代码看起来像这样

0 投票
3 回答
95 浏览

sql - oracle中的“线融合”

我正在尝试在 Oracle 中进行“行融合”,即我想要一个返回行的查询,并且这些行中的每一行对于每一列都有最初存储在其他行中的值。

例如(我正在关注文档),假设我有一个员工表EMP存储员工编号、他的部门编号和他的薪水

如何创建一个查询,该查询返回与部门一样多的行,并返回该部门的最高薪水?

我想要这样的东西:

这个查询

是我能找到的最接近的,但我需要一个GROUP BY无法添加的额外 deptno 子句。