sql - Oracle SQL Count 或 Sum 以防万一查询?
问题描述
我在 StackOverflow 上研究了五个不同的线程,我觉得我已经接近了,但仍然没有雪茄。我的原始表格有几个部分,每个部分有几行,每行有几个位置。我希望能够查询一个结果,该结果列出了部分、行、位置、有多少位置高于该行(位置编号较低)以及有多少位置低于该行(位置编号更大)。
这是我所拥有的:
SELECT section,
row,
position AS P,
SUM(case when position < P then 1 else 0 end) AS Above,
SUM(case when position > P then 1 else 0 end) AS Below
FROM OriginalTable
GROUP BY section, row, position
ORDER BY section, row, position
求和的情况没有将 P 识别为位置,当我将 P 更改为数字时,总和就差了。
解决方案
一种可能的解决方案是相关子查询获取count()
部分和行的较低/较高位置。
SELECT ot1.section,
ot1.row,
ot1.position,
(SELECT count(*)
FROM originaltable ot2
WHERE ot2.section = ot1.section
AND ot2.row = ot2.row
AND ot2.position > ot1.position) above,
(SELECT count(*)
FROM originaltable ot2
WHERE ot2.section = ot1.section
AND ot2.row = ot2.row
AND ot2.position < ot1.position) below
FROM originaltable ot1
ORDER BY ot1.section,
ot1.row,
ot1.position;
另一种是使用窗口版本的count()
.
SELECT ot1.section,
ot1.row,
ot1.position,
count(*) OVER (PARTITION BY ot1.section,
ot1.row
ORDER BY ot1.position
RANGE BETWEEN CURRENT ROW
AND UNBOUNDED FOLLOWING) - 1 above
count(*) OVER (PARTITION BY ot1.section,
ot1.row
ORDER BY ot1.position
RANGE BETWEEN UNBOUNDED PRECEDING
AND CURRENT ROW) - 1 below
FROM originaltable ot1
ORDER BY ot1.section,
ot1.row,
ot1.position;
推荐阅读
- javascript - 比较两个数组并通过从父数组中删除子数组元素返回一个新数组
- javascript - Axios 没有按预期返回数据
- java - Java POJO 建模 - 对象列表与每个对象的多个字段
- javascript - (node:274) UnhandledPromiseRejectionWarning: TypeError: db.all is not a function
- r - 在R中计算具有一定数量事件的日期之前的天数
- javascript - 如何在函数上创建一个点国家?
- javascript - 如何格式化数据以发送格式如 jQuery 请求的 vanilla XHR
- python - 解决 LeetCode #1 的问题:得到一个参数的多个值
- c# - Avalonia UI 中带有全尺寸图标的按钮
- nginx - 在不为 EC2 中的每个人打开安全组中的 3000 端口的情况下,无法允许 nginx 在不同的端口 3000 上运行