2016-08-09 1 views
0

グループ化されたデータの最初の行を返すクエリを作成しています。私はBY句PARTITIONにわたって使用してみましたが、どういうわけか、私は、所望の結果が届かない:ORACLEデータセットの最初の行を返すクエリ

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、l6d、l7d、l8d、l9d、l10d)

しかし、私は奇妙な結果を得ています。 可能な解決策を提案してください。

+1

これらすべてのROWNUM = 1つのフィルタだけで、対応するテーブルから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) これらのグループ化された値ごとにただ1つの行が必要です。 – Pradeep

0

このクエリは、期待される結果を返し: FROM

SELECT *を(によりleafv、value_group、L1D、L2D、L3D、L4D、l5d、l6d、l7d順序によってROW_NUMBER()OVER(パーティションを選択leafv、value_group、L1D、L2D、L3D、L4D、l5d、l6d、l7d)MYROWNUM、 S. * FROM、leafv、 NVL(chain_name、 'NULLVALUE')value_group(NVL(SKU、 'NULLVALUE' を選択) NVL(level_10_description、 'NULLVALUE')l10d、 NVL(level_1_description、 'NULLVALUE')l1d、 NVL(レベル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 leafv BY test_partition 順序と、 value_group、 L1D、 L2D 、 3d、 4d、 5d、 16d、 17d、 18d、 l9d、 l10d )S )あなたも彼らと何かを行うために取得する前にMYROWNUM = 1

関連する問題