Oracle FAQ | Your Portal to the Oracle Knowledge Grid |
![]() |
![]() |
Home -> Community -> Mailing Lists -> Oracle-L -> Re: how to write this sql?
Guang,
I would try to use the row_number() analytical function in a subquery, but I am not convinced by the result :
SQL> @a
SQL> select user#, least(count(1), 50)
2 from sys.seg$
3 group by user#
4 /
USER# LEAST(COUNT(1),50)
---------- ------------------ 0 50 5 50 11 5 18 19 19 11 21 2 22 50 24 50 26 19 27 19 46 3 47 2 50 46 62 9
14 rows selected.
Execution Plan
0 SELECT STATEMENT Optimizer=CHOOSE
1 0 SORT (GROUP BY)
2 1 TABLE ACCESS (FULL) OF 'SEG$'
Statistics
0 recursive calls 5 db block gets
0 redo size 1009 bytes sent via SQL*Net to client 425 bytes received via SQL*Net from client 2 SQL*Net roundtrips to/from client 1 sorts (memory) 0 sorts (disk) 14 rows processed
SQL> @a2
SQL> select user#, max(cnt)
2 from (select user#, row_number() over (partition by user#
3 order by 1) cnt 4 from sys.seg$)
USER# MAX(CNT)
---------- ----------
0 50 5 50 11 5 18 19 19 11 21 2 22 50 24 50 26 19 27 19 46 3 47 2 50 46 62 9
14 rows selected.
Execution Plan
0 SELECT STATEMENT Optimizer=CHOOSE
1 0 SORT (GROUP BY)
2 1 VIEW
3 2 WINDOW (SORT)
4 3 TABLE ACCESS (FULL) OF 'SEG$'
Statistics
0 recursive calls 5 db block gets
2 SQL*Net roundtrips to/from client 2 sorts (memory) 0 sorts (disk) 14 rows processed
SQL> @a3
SQL> select user#, max(cnt)
2 from (select user#, count(1) over (partition by user#
3 order by 1 4 rows between 0 preceding and 49 following) cnt 5 from sys.seg$)
USER# MAX(CNT)
---------- ----------
0 50 5 50 11 5 18 19 19 11 21 2 22 50 24 50 26 19 27 19 46 3 47 2 50 46 62 9
14 rows selected.
Execution Plan
0 SELECT STATEMENT Optimizer=CHOOSE
1 0 SORT (GROUP BY)
2 1 VIEW
3 2 WINDOW (SORT)
4 3 TABLE ACCESS (FULL) OF 'SEG$'
Statistics
0 recursive calls 5 db block gets
2 SQL*Net roundtrips to/from client 2 sorts (memory) 0 sorts (disk) 14 rows processed
Guang Mei wrote:
>Oracle 8173.
>
>I have a query like this:
>
>select x, count(1) cnt from ABC group by x;
>
>which shows:
>
> X CNT
>---------- ----------
> 1 25
> 2 18
> 6 156
> 7 529
> 8 43
> 9 355
>
>
>What I want is
>
> X CNT
>---------- ----------
> 1 25
> 2 18
> 6 100
> 7 100
> 8 43
> 9 100
>
>This means any count > 100 will be replaced with value 100. I have no
>problem of displaying this. What I would like to have is to let oracle know
>that when the count reaches 100, stop counting for that x. This way oracle
>does not need to keep scan after cnt reaches 100, hopefully saving some
>time. (somehow it is similar to adding rownum=1 to let oracle stop when
>certain condition is met).
>
>Is it possible to add something to the query to accomplish this?
>
>TIA.
>
>Guang
>
>----------------------------------------------------------------
>Please see the official ORACLE-L FAQ: http://www.orafaq.com
>----------------------------------------------------------------
>To unsubscribe send email to: oracle-l-request_at_freelists.org
>put 'unsubscribe' in the subject line.
>--
>Archives are at http://www.freelists.org/archives/oracle-l/
>FAQ is at http://www.freelists.org/help/fom-serve/cache/1.html
>-----------------------------------------------------------------
>
>
>
-- Archives are at http://www.freelists.org/archives/oracle-l/ FAQ is at http://www.freelists.org/help/fom-serve/cache/1.html -----------------------------------------------------------------Received on Mon Jul 19 2004 - 15:19:53 CDT
![]() |
![]() |