2017-01-24 22 views
0

ROW_NUMBERが同じ値列に対して同じ行番号を持つ必要があります.MFGPN(同じMFGPNは常に順番に並んでいます)。また、私はここに私のテーブルには希望が、トラブルに実行していますを達成するために)私は(RANKを使用してみました同じRow_Number同じ値の場合

No  MFGPN 
1  Z363700Z01 
2  Z363700Z01 
3  0119-960-1 
4  1A3F1-0503-01 

のナンバー

ことにより、元の順序を維持する必要があります。

Item MFGPN   Desired Result 
3  Z363700Z01   1 
3  Z363700Z01   1 
1  0119-960-1   2 
2  1A3F1-0503-01   3 

SELECT RANK() OVER(ORDER BY MFGPN) As [Item], MFGPN FROM Table1 ORDER BY [No] ASC 

RESULTは君たち専門家のアドバイスに感謝します。ありがとう!

答えて

2

RANKの代わりにDENSE_RANKウィンドウ関数を使用してください。 Rankは、データの繰り返しがあるときにシーケンスをスキップしますDense_Rankはそうしません。

SELECT MFGPN, 
     Dense_rank()OVER(ORDER BY m_no) as [Desired Result] 
FROM (SELECT no, 
       MFGPN, 
       Min(no)OVER(partition BY MFGPN) AS m_no 
     FROM (VALUES (1,'Z363700Z01'), 
         (2,'Z363700Z01'), 
         (3,'0119-960-1'), 
         (4,'1A3F1-0503-01')) tc (no, MFGPN))a 

noが一意でない場合は、DENSE_RANK

Dense_rank()OVER(ORDER BY m_no,MFGPN) 

の結果変更:

+---------------+----------------+ 
|  MFGPN  | Desired Result | 
+---------------+----------------+ 
| Z363700Z01 |    1 | 
| Z363700Z01 |    1 | 
| 0119-960-1 |    2 | 
| 1A3F1-0503-01 |    3 | 
+---------------+----------------+ 
+0

感謝。私はそれを得ることはありません。私はまだDENSE_RANKで3,3,1,2を得ています。 1、1、2、3にする必要があります。 – Bobbit

+0

@Bobbit - 注文をどのように定義したいですか? 'Z363700Z01'が' 1'、 '1A3F1-0503-01'が' 3'でなければならないのはなぜですか? –

+0

'[No]'で注文してください。 – Bobbit

0

を同じmfgpnを持つ行を取得するように、mfgpnで結果を分割すべきですnoで同じランクと注文。

SELECT DENSE_RANK() OVER(PARTITION BY [mfgpn] ORDER BY [no]) As [Item], 
     [mfgpm] 
FROM  Table1 
ORDER BY [No] ASC 
0
select  sum(case when MFGPN = prev_MFGPN then 0 else 1 end) over (order by No) as item 
      ,MFGPN 

from  (SELECT  lag(MFGPN) over (order by [No]) as prev_MFGPN 
         ,[No] 
         ,MFGPN 
      FROM  Table1 
      ) t 

ORDER BY [No] ASC 

+------+---------------+ 
| item | MFGPN   | 
+------+---------------+ 
| 1 | Z363700Z01 | 
+------+---------------+ 
| 1 | Z363700Z01 | 
+------+---------------+ 
| 2 | 0119-960-1 | 
+------+---------------+ 
| 3 | 1A3F1-0503-01 | 
+------+---------------+ 
+0

これはあなたが要求したものです –

+0

'' lag 'は認識された組み込み関数名ではありません。 '私はこれを持っています。申し訳ありませんが、私は2008年を使用していると指摘していたはずです – Bobbit

0

あなたがスニペットの下に試すことができます。また、dense_rankを使用すると、任意のランクを "スキップ" していないことを確認します。この場合、上記で説明したDENSE_RANK()は最良のアプローチです。

SELECT a.*, 
     DENSE_RANK() OVER(ORDER BY MFGPN DESC) RN 
    FROM 
     (SELECT 1 AS no, 'Z363700Z01' AS mfgpn FROM dual 
     UNION ALL 
     SELECT 2 AS no, 'Z363700Z01' AS mfgpn FROM dual 
     UNION ALL 
     SELECT 3 AS no, '0119-960-1' AS mfgpn FROM dual 
     UNION ALL 
     SELECT 4 AS no, '1A3F1-0503-01' AS MFGPN FROM dual 
    )a; 

-------------------------------OUTPUT------------------------------------------- 
NO MFGPN   RN 
1 Z363700Z01  1 
2 Z363700Z01  1 
4 1A3F1-0503-01 2 
3 0119-960-1  3 

-------------------------------------------------------------------------------- 
0

ITを試してみてください。私はそれがjoinを使用し、以下のように所望の出力を得るために値を比較するために、よりシンプルかつ柔軟だと思う:迅速な対応@Prdpため

SELECT p.MFGPN, 
     Dense_rank()OVER(ORDER BY CASE WHEN p.MFGPN = tp.MFGPN THEN tp.num ELSE p.num END) AS [Desired Result] 
FROM tmp_option p 
LEFT JOIN tmp_option tp ON tp.num+1 = p.num 
ORDER BY p.num ASC 
関連する問題