Oracle11g SQL减少表上的选择数

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的所有行 现在我有了所有涉及到处理

我的SQL查询有性能问题:(在Oracle SQL上)

专用于特定processid(4711)的所有行的结果:

我的数据库里充满了这样的数据。问题是,步长值不是固定的。也可以是:

260,310,570,600 ...
现在,我想得到每个进程_planned=75,Status=10的数据,但我只想要这些进程,它们的第一个条目(在上面步骤10的示例中)等于10。我的解决办法如下:

  • 1查询获取具有不同processid的process_Planning=75的所有行
  • 现在我有了所有涉及到处理_id=75的过程
  • 然后,我对每个流程id进行子查询,检查第一步是否与流程\u planned=75相关,以及状态是否为10
  • 然后我将这些数据写入一个数组中
现在的问题是我的解决方案缺乏性能!e、 g.40 processid,我对解决方案241查询执行的每6个步骤!一定有更简单的方法

但是我不知道,如果这个步骤是固定的,那就很容易了,然后只需要加上step=10就可以得到第一个步骤

您有什么想法吗?

您是否尝试使用查找每个进程id的第一条记录

您可以使用行编号对每个流程id返回的记录进行排名。然后可以筛选排名靠前的记录


我认为您要求的是
步骤
的最低值,其中
流程=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;