как получить минимальное и максимальное количество строк столбца для каждой строки - PullRequest
1 голос
/ 20 декабря 2011

Я хотел бы получить максимальное и минимальное значение в одной строке из одной таблицы

Например, у меня есть следующие строки в таблице a:

Insert into TABLE1
   (TRADE_DATE, COL_NAME, COL_VALUE, REC_COUNT)
 Values
   (TO_DATE('12/08/2011 00:00:00', 'MM/DD/YYYY HH24:MI:SS'), 'STOCK_SYM', 'A', 1210885);
Insert into TABLE1
   (TRADE_DATE, COL_NAME, COL_VALUE, REC_COUNT)
 Values
   (TO_DATE('12/08/2011 00:00:00', 'MM/DD/YYYY HH24:MI:SS'), 'STOCK_SYM', 'AA', 1211091);
Insert into TABLE1
   (TRADE_DATE, COL_NAME, COL_VALUE, REC_COUNT)
 Values
   (TO_DATE('12/08/2011 00:00:00', 'MM/DD/YYYY HH24:MI:SS'), 'STOCK_SYM', 'AAAA', 9);
Insert into TABLE1
   (TRADE_DATE, COL_NAME, COL_VALUE, REC_COUNT)
 Values
   (TO_DATE('12/08/2011 00:00:00', 'MM/DD/YYYY HH24:MI:SS'), 'STOCK_SYM', 'AAAE', 1);
Insert into TABLE1
   (TRADE_DATE, COL_NAME, COL_VALUE, REC_COUNT)
 Values
   (TO_DATE('12/08/2011 00:00:00', 'MM/DD/YYYY HH24:MI:SS'), 'STOCK_SYM', 'AABVF', 11);
Insert into TABLE1
   (TRADE_DATE, COL_NAME, COL_VALUE, REC_COUNT)
 Values
   (TO_DATE('12/08/2011 00:00:00', 'MM/DD/YYYY HH24:MI:SS'), 'STOCK_SYM', 'AAC', 916);
Insert into TABLE1
   (TRADE_DATE, COL_NAME, COL_VALUE, REC_COUNT)
 Values
   (TO_DATE('12/08/2011 00:00:00', 'MM/DD/YYYY HH24:MI:SS'), 'STOCK_SYM', 'AACAY', 2);
Insert into TABLE1
   (TRADE_DATE, COL_NAME, COL_VALUE, REC_COUNT)
 Values
   (TO_DATE('12/08/2011 00:00:00', 'MM/DD/YYYY HH24:MI:SS'), 'STOCK_SYM', 'AACC', 2469);
Insert into TABLE1
   (TRADE_DATE, COL_NAME, COL_VALUE, REC_COUNT)
 Values
   (TO_DATE('12/08/2011 00:00:00', 'MM/DD/YYYY HH24:MI:SS'), 'STOCK_SYM', 'AACOU', 66);

я хотел бы получитьрезультаты, как показано ниже

col_val1 max_val     col_val2    min_val
-------- -------     --------    ------
AA       1211091     AAAE        1
A        1210885     AACAY       2
AACC     2496        AAAA        9
AAC      916         AABVF       11
AACOU    66          AACOW       56

Я пытался min(col_value) over (partition by trade_date order by rec_count), но я могу получить только мин или макс.Когда я создаю две таблицы, одну с min и другую с max, и выбираю из нее, я получаю декартово объединение.

Ответы [ 2 ]

3 голосов
/ 20 декабря 2011

Возвращает ожидаемый результат.Следует отметить, что при наличии нечетного числа результатов нижняя строка будет иметь одинаковые значения для col_val1 и col_val2

WITH data as (   
   SELECT  
            row_number() over (order by rec_count desc) rn_desc,
            row_number() over (order by rec_count asc) rn_asc,
            trade_date,
            COL_NAME,
            col_value,
            rec_count

   FROM TAble1) 
SELECT 
    d1.col_value col_val1,
    d1.rec_count max_val,
    d2.col_value col_val2,
    d2.rec_count min_val
FROM
    data d1
    INNER JOIN data d2
    ON d1.rn_desc = d2.rn_asc
WHERE 
    d1.rn_desc <= (select CEIL(COUNT(*)/2) FROM data)

Рабочий пример можно посмотреть по этому запросу data.se .(Обратите внимание, что существует небольшая разница в переводе в синтаксис SQL Server, особенно в CEILING против CEIL)

2 голосов
/ 20 декабря 2011

Я думаю, вам может понадобиться

select col_val, rec_count, 
       row_number over (partition by trade_date order by rec_count DESC) as HiLoRow

для первых 2 столбцов в вашем ответе, затем

select col_val, rec_count, 
       row_number over (partition by trade_date order by rec_count ) as LoHiRow

за второй тайм. Затем выберите из них оба, вложенные и присоединитесь к HiLoRow = LoHiRow

Вещи могут все еще не быть идеальными, если два col_vals имеют одинаковое rec_count.
Список также будет вдвое длиннее, чем вам нужно, поэтому вы можете захотеть что-то вроде

where q1.rec_count >= q2.rec_count

чтобы уменьшить длину вдвое.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...