выберите первые 10 строк, а затем решите, какие строки включить впоследствии - PullRequest
3 голосов
/ 09 мая 2011

У меня есть 2 столбца в таблице.1-й столбец представляет названия различных компаний, а 2-й столбец отображает количество продуктов.

COL 1         COL 2
CompA         2323
CompB         2320
CompC         1999
CompD         1598
CompE         1400...so on

Я хочу отобразить первые 10 строк, показывающих первые 10 компаний и их количество в порядке убывания,Затем я хочу сравнить 10-е число компаний с 11-м числом компаний.Если они совпадают, отобразите 11-е название компании и ее количество.Если счет 10-й компании не соответствует счету 11-й компании, то отображаются только первые 10 записей.

У меня есть доступ только для чтения, поэтому я не могу обновить или вставить новые записи в таблицу.это можно сделать?

Ответы [ 4 ]

7 голосов
/ 09 мая 2011

Если то, что вы хотите сделать, это отобразить первые десять отсчетов, включая связи.Это легко решить с помощью АНАЛИТИЧЕСКОЙ функции, такой как RANK() или DENSE_RANK() ...

SQL> select * from
  2      ( select
  3          ename
  4             , sal
  5             , rank() over (order by sal desc) sal_rank
  6      from emp
  7      )
  8  where sal_rank <= 10
  9  /

ENAME             SAL   SAL_RANK
---------- ---------- ----------
QUASSNOI         6500          1
SCHNEIDER        5000          2
FEUERSTEIN       4500          3
VERREYNNE        4000          4
LIRA             3750          5
PODER            3750          5
KESTELYN         3500          7
TRICHLER         3500          7
GASPAROTTO       3000          9
ROBERTSON        2990         10
RIGBY            2990         10

11 rows selected.

SQL>

Обратите внимание, что если бы у RIGBY была та же зарплата, что и у GASPAROTTO, их SAL_RANK был бы 9 , ROBERTSON был бы 11 , а результирующий набор состоял бы из десяти строк.

DENSE_RANK() отличается от RANK() тем, что он всегда возвращает первые десять вместо того, чтобы пропускать связи ...

SQL> select * from
  2      ( select
  3          ename
  4             , sal
  5             , dense_rank() over (order by sal desc) sal_rank
  6      from emp
  7      )
  8  where sal_rank <= 10
  9  /

ENAME             SAL   SAL_RANK
---------- ---------- ----------
                               1
SCHNEIDER        5000          2
FEUERSTEIN       4500          3
VERREYNNE        4000          4
LIRA             3750          5
PODER            3750          5
KESTELYN         3500          6
TRICHLER         3500          6
GASPAROTTO       3000          7
ROBERTSON        2990          8
RIGBY            2990          8
SPENCER          2850          9
BOEHMER          2450         10

13 rows selected.

SQL>
0 голосов
/ 09 мая 2011

Я думаю, что то, что вы говорите, можно сделать, написав код pl / sql кода запроса top-n.что-то подобное поможет

decalre
    v_col_1    companies.col_1%TYPE;
    v_col_2    companies.col_2%TYPE;
    count number;    
    col_2_all number;
    CURSOR companies is SELECT *
        FROM (select * from companies ORDER BY col_2) 
        WHERE rownum <= 10
        ORDER BY rownum;

begin

    loop 
      fetch companies into v_cal_1,v_col_2;
      count++;
      if count =10 then
        col_2_all=v_col_2
        dbms_output.put_line('company name'||v_cal_1||'company count'||v_cal_2);
      elsif count =11 then
        if col_2_all=v_col_2 then
          dbms_output.put_line('company name'||v_cal_1||'company count'||v_cal_2);
        end if;
      end if;
    EXIT WHEN count>11;

end;

Я не уверен насчет синтаксиса, но это должно быть что-то вроде этого:)

0 голосов
/ 09 мая 2011
With Top10Co As
    (
    Select Col1 As CompanyName, Col2 As Cnt
        , Row_Number() Over ( Order By Col2 Desc ) As Num
    From MyTable
    )
Select CompanyName, Cnt
From Top10Co
Where Num <= 10
Union All
Select Col1, Col2
From MyTable
Where Exists    (
                Select 1
                From Top10Co As T2
                Where T2.Num = 10
                    And T2.CompanyName <> MyTable.Col1
                    And T2.Cnt = MyTable.Col2
                )
0 голосов
/ 09 мая 2011

Попробуйте это:

SELECT col1, col2
FROM (
   SELECT col1, col2
     FROM Table
     WHERE col2 >= (SELECT col2
                      FROM (SELECT col2 FROM Table ORDER BY col2 DESC) t1
                     WHERE t1.ROWNUM = 10)
     ORDER BY col2 DESC) t2
WHERE t2.ROWNUM <= 11
...