Oracle11g SQL减少表上的选择数
我的SQL查询有性能问题:(在Oracle SQL上) 专用于特定processid(4711)的所有行的结果: 我的数据库里充满了这样的数据。问题是,步长值不是固定的。也可以是:Oracle11g SQL减少表上的选择数,oracle11g,query-performance,Oracle11g,Query Performance,我的SQL查询有性能问题:(在Oracle SQL上) 专用于特定processid(4711)的所有行的结果: 我的数据库里充满了这样的数据。问题是,步长值不是固定的。也可以是: 260,310,570,600 ... 现在,我想得到每个进程_planned=75,Status=10的数据,但我只想要这些进程,它们的第一个条目(在上面步骤10的示例中)等于10。我的解决办法如下: 1查询获取具有不同processid的process_Planning=75的所有行 现在我有了所有涉及到处理
260,310,570,600 ...
现在,我想得到每个进程_planned=75,Status=10的数据,但我只想要这些进程,它们的第一个条目(在上面步骤10的示例中)等于10。我的解决办法如下:
- 1查询获取具有不同processid的process_Planning=75的所有行
- 现在我有了所有涉及到处理_id=75的过程
- 然后,我对每个流程id进行子查询,检查第一步是否与流程\u planned=75相关,以及状态是否为10
- 然后我将这些数据写入一个数组中
我认为您要求的是
步骤
的最低值,其中流程=75
和状态=10
,在这种情况下您可以这样做
SELECT MIN(step) AS step, processid, status, process_planned
FROM data
WHERE process_planned = 75 AND status = 10
GROUP BY processid, status, process_planned;
感谢您的快速回答:我已经根据自己的需要更改了代码,但是我得到了以下例外:“缺少右括号”,我应该说,我使用Oracle SQL听起来像是一个打字错误。您的代码中可能多了一个。我在SQLServer中测试了这个示例。Oracle文档的行号如下所示。不确定是否有任何差异。您可能应该从标记中删除SQL Server。它增加了你得到答案的几率,而不是不适合你。
260,310,570,600 ...
WITH SampleDate AS
(
/* This CTE returns some example records.
*/
SELECT
r.*
FROM
(
VALUES
(10, 4711, 30, 75),
(20, 4711, 50, 81),
(30, 4711, 10, 75),
(40, 4711, 10, 75),
(50, 4711, 10, 25)
) AS r(Step, ProcessId, [Status], Processed_Planned)
)
/* Main query returns the first row for
* each process id with a planned of 75
* and a status of 10.
*/
SELECT
r.*
FROM
(
/* This sub query ranks the steps from each
* procsss id.
*/
SELECT
ROW_NUMBER() OVER(PARTITION BY ProcessId ORDER BY Step) AS RowNumber,
*
FROM
SampleDate
WHERE
Processed_Planned = 75
AND [Status] = 10
) AS r
WHERE
RowNumber = 1
;
SELECT MIN(step) AS step, processid, status, process_planned
FROM data
WHERE process_planned = 75 AND status = 10
GROUP BY processid, status, process_planned;