2016-08-09 3 views
0

Я пишу запрос, который возвращает первую строку набора сгруппированных данных. Я попытался с помощью НАД РАЗДЕЛА пунктом, но так или иначе я не получаю желаемого результата:ORACLE Запрос для возврата First Row для DataSet

select row_number() OVER(PARTITION BY leafv , value_group , l1d ,l2d ,l3d ,l4d ,l5d ,l6d ,l7d 
order by leafv , value_group , l1d ,l2d ,l3d ,l4d ,l5d ,l6d ,l7d 
) MYROWNUM , 
S.* 
from 
(SELECT 
    NVL(CASE 
    WHEN (SELECT parameter_value 
     FROM V_CONFIG_PARAMETERS 
     WHERE rownum  = 1 
     AND parameter_name = 'MOMENT_ITEM_NUMBER_TYPE') = 'S' 
    THEN sku 
    WHEN (SELECT parameter_value 
     FROM V_CONFIG_PARAMETERS 
     WHERE rownum  = 1 
     AND parameter_name = 'MOMENT_ITEM_NUMBER_TYPE') = 'U' 
    THEN upc 
    WHEN (SELECT parameter_value 
     FROM V_CONFIG_PARAMETERS 
     WHERE rownum  = 1 
     AND parameter_name = 'MOMENT_ITEM_NUMBER_TYPE') = 'C' 
    THEN CUSTOM_PRODUCT_CODE 
    END,'NULLVALUE') leafv, 
    nvl(chain_name,'NULLVALUE') value_group, 
    nvl(level_10_description ,'NULLVALUE') l10d, 
    nvl(level_1_description,'NULLVALUE') l1d, 
    nvl(level_2_description,'NULLVALUE') l2d, 
    nvl(level_3_description,'NULLVALUE') l3d, 
    nvl(level_4_description,'NULLVALUE') l4d, 
    nvl(level_5_description,'NULLVALUE') l5d, 
    nvl(level_6_description,'NULLVALUE') l6d, 
    nvl(level_7_description,'NULLVALUE') l7d, 
    nvl(level_8_description,'NULLVALUE') l8d, 
    nvl(level_9_description,'NULLVALUE') l9d 
    FROM t_product_catalog_flat 
    order by leafv , value_group , l1d ,l2d ,l3d ,l4d ,l5d ,l6d ,l7d ,l8d ,l9d ,l10d) S 
    order by MYROWNUM 

Ожидаемые результаты: 1 строка для каждого набора данных, имеющих одинаковое значение для группы столбцов (leafv, value_group, l1d, l2d, l3d, l4d, l5d, ldd, lddd, lddd, lddd, lddd, ldd, ldd, ldd, ldd, ldd, Пожалуйста, предложите возможное решение

+1

Все эти RowNum = 1 фильтр просто возвращает один (случайный!) Строки из соответствующих таблиц, прежде чем вы даже получите, чтобы сделать что-нибудь еще с ними. Затем ROW_NUMBER() OVER (....) должен быть во внутреннем запросе; внешний запрос должен иметь только фильтр WHERE RN = 1. – mathguy

+0

Спасибо за ответ. Не могли бы вы рассказать немного больше о своем предложении. – Pradeep

ответ

0

Этот запрос выполняется по DBA_TAB_COLS и сгруппирован по имени таблицы и типу данных. Он отбрасывает первую сгруппированную строку.

Надеюсь, это не слишком упрощенно для того, что вы пытаетесь достичь.

select * 
from (
    select t.TABLE_NAME, t.DATA_TYPE 
    from dba_tab_cols t 
    where t.OWNER = 'SYS' 
    group by t.TABLE_NAME, t.DATA_TYPE 
    order by t.TABLE_NAME, t.DATA_TYPE 
) 
where rownum = 1 
+0

Спасибо за предложение. Это не помогло. Есть дубликаты для комбинации столбцов (leafv, value_group, l1d, l2d, l3d, l4d, l5d, l6d, l7d) Я хочу только одну строку для каждого из этих сгруппированных значений. – Pradeep

0

Этот запрос возвращает ожидаемый результат:

SELECT * FROM (SELECT ROW_NUMBER() OVER (раздел по leafv, value_group, L1d, L2D, L3D, л4д, L5D, l6d, l7d порядке leafv, value_group, L1d, L2D, L3D, л4д, L5D, l6d, l7d) MYROWNUM, С. * ОТ (SELECT NVL (ы, '') NULLVALUE leafv, NVL (chain_name, 'NULLVALUE') value_group, NVL (level_10_description, 'NULLVALUE') l10d, NVL (level_1_description, 'NULLVALUE') l1d, NVL (level_2 _description, 'NULLVALUE') L2D, NVL (level_3_description, 'NULLVALUE') L3D, NVL (level_4_description, 'NULLVALUE') л4д, NVL (level_5_description, 'NULLVALUE') L5D, NVL (level_6_description, 'NULLVALUE') l6d, NVL (level_7_description, 'NULLVALUE') l7d, NVL (level_8_description, 'NULLVALUE') l8d, NVL (level_9_description, 'NULLVALUE') l9d ОТ test_partition ORDER BY leafv, value_group, L1d, L2D , l3d, l4d, l5d, l6d, l7d, l8d, l9d, l10d ) S ) WHERE MYROWNUM = 1