-1

SQL SERVER 2008 を使用しています。次のクエリがあります。

SELECT Row_number() 
         OVER ( 
           partition BY ru.rul_icontfk 
           ORDER BY rut.rut_isortorder, cnt.ctr_caltcode3, rut.rut_crultype, 
         ru.rul_ntiermax) AS order1, 
       ru.rul_ipk, 
       ru.rul_icontfk, 
       ru.rul_crultype, 
       ru.rul_cisbn, 
       ru.rul_crecipid, 
       ru.rul_ccalcmeth, 
       ru.rul_ctiertype, 
       ru.rul_ntiermax 
FROM   rules.ru 
       INNER JOIN ruletype rut 
               ON rut.rut_crultype = ru.rul_crultype 
       INNER JOIN country cnt 
               ON cnt.ctr_cisocode = ru.rul_cctry 
WHERE  ru.rul_icontfk = '108122' --and rul_ipk=1227754 
ORDER  BY order1        


+--------+---------+-------------+--------------+---------------+--------------+---------------+---------------+---------------+
| order1 | rul_ipk | rul_icontfk | rul_crultype |   rul_cisbn   | rul_crecipid | rul_ccalcmeth | rul_ctiertype | rul_ntiermax  |
+--------+---------+-------------+--------------+---------------+--------------+---------------+---------------+---------------+
|      1 | 1227752 |      108122 | 1            | 9780415910866 | S565154      | N             | LU            |      9999999  |
|      2 | 1227758 |      108122 | 1            | 9780415910866 | S565154      | N             | LU            |      9999999  |
|      3 | 1227754 |      108122 | 1            | 9780415910866 | S565154      | N             | LU            |       9999999 |
|      4 | 1227759 |      108122 | 2            | 9780415910866 | S565154      | N             | LU            |       9999999 |
|      5 | 1227755 |      108122 | 2            | 9780415910866 | S565154      | N             | LU            |       9999999 |
|      6 | 1227753 |      108122 | 3            | 9780415910866 | S565154      | N             | LU            |       9999999 |
|      7 | 1227760 |      108122 | 3            | 9780415910866 | S565154      | N             | LU            |       9999999 |
|      8 | 1227756 |      108122 | 3            | 9780415910866 | S565154      | N             | LU            |       9999999 |
|      9 | 1227761 |      108122 | S            | 9780415910866 | S565154      | N             | LU            |       9999999 |
|     10 | 1227762 |      108122 | T            | 9780415910866 | S565154      | N             | LU            |       9999999 |
|     11 | 1227757 |      108122 | 4            | 9780415910866 | S565154      | N             | LU            |       9999999 |
+--------+---------+-------------+--------------+---------------+--------------+---------------+---------------+---------------+

rul_ipk > 1227754 で、order1 > 3 のレコードを取得する方法を知りたいです。

SELECT * 
FROM   (SELECT *, 
               Row_number() 
                 OVER ( 
                   ORDER BY rut.rut_isortorder, cnt.ctr_caltcode3, 
                 rut.rut_crultype, 
                 RU.rul_ntiermax) AS row 
        FROM   rules ru 
               INNER JOIN ruletype rut 
                       ON rut.rut_crultype = ru.rul_crultype 
               INNER JOIN country cnt 
                       ON cnt.ctr_cisocode = ru.rul_cctry 
        WHERE  ru.rul_icontfk = '108122') a 
WHERE  row > 3 


+---------+-------------+
| rul_ipk | rul_icontfk |
+---------+-------------+
| 1227759 |      108122 |
| 1227755 |      108122 |
| 1227753 |      108122 |
| 1227760 |      108122 |
| 1227756 |      108122 |
| 1227761 |      108122 |
| 1227762 |      108122 |
| 1227757 |      108122 |
+---------+-------------+

レコード番号を取得するためにこのクエリで結果を取得しようとしましたが、 order1 = 1 を取得します

SELECT Row_number() 
         OVER ( 
           partition BY ru.rul_icontfk 
           ORDER BY rut.rut_isortorder, cnt.ctr_caltcode3, rut.rut_crultype, 
         RU.rul_ntiermax) AS order1, 
       RU.rul_ipk, 
       RU.rul_icontfk, 
       RU.rul_crultype, 
       RU.rul_cisbn, 
       RU.rul_crecipid, 
       RU.rul_ccalcmeth, 
       RU.rul_ctiertype, 
       RU.rul_ntiermax 
FROM   rules ru 
       INNER JOIN ruletype rut 
               ON rut.rut_crultype = ru.rul_crultype 
       INNER JOIN country cnt 
               ON cnt.ctr_cisocode = ru.rul_cctry 
WHERE  ru.rul_icontfk = '108122' 
       AND rul_ipk = 1227754 
ORDER  BY order1 
order1 rul_ipk rul_icontfk rul_crultype
1 1227754 108122 1


このクエリを試しました

SELECT * FROM (
  SELECT *, ROW_NUMBER() OVER (ORDER BY rut.rut_isortorder, cnt.ctr_caltcode3, rut.rut_crultype, RU.rul_ntiermax) を行として
   FROM RULES ル  
                    rut.rut_crultype = ru.rul_crultype の内部結合ルールタイプのわだち掘れ                               
                    内部結合国 cnt on cnt.ctr_cisocode = ru.rul_cctry
                    WHERE ru.rul_icontfk = '108122'
 ) a WHERE 行 > (SELECT rownum.order1 from (select row_number() over (ru.rul_icontfk によるパーティション rut.rut_isortorder, cnt.ctr_caltcode3, rut.rut_crultype,
                    RU.rul_ntiermax) を order1 として、
                    RU.rul_ipk、RU.rul_icontfk、RU.rul_crultype、RU.rul_cisbn、
                    RU.rul_crecipid、RU.rul_ccalcmeth、RU.rul_ctiertype、RU.rul_ntiermax
                    from RULES ル  
                    rut.rut_crultype = ru.rul_crultype の内部結合ルールタイプのわだち掘れ                               
                    内部結合国 cnt on cnt.ctr_cisocode = ru.rul_cctry
                    WHERE ru.rul_icontfk = '108122'  
                    ) rul_ipk=1227754 の行番号として)

望ましい結果が得られますが、これを行う最も簡単な方法があるかどうかはわかりません

rul_ipk rul_icontfk rul_crultype
1227759 108122 2
1227755 108122 2
1227753 108122 3
1227760 108122 3
1227756 108122 3
1227761 108122 S
1227762 108122 T
1227757 108122 4
4

2 に答える 2

1

両方の行番号で選択を作成し、CTE を使用して 2 つの数値を比較することができます。

WITH  CTE AS 
(SELECT
       Row_number() 
             OVER ( 
               ORDER BY rut.rut_isortorder, cnt.ctr_caltcode3, 
             rut.rut_crultype, 
             RU.rul_ntiermax) AS row,
       Row_number() 
         OVER ( 
           partition BY ru.rul_icontfk 
           ORDER BY rut.rut_isortorder, cnt.ctr_caltcode3, rut.rut_crultype, 
         ru.rul_ntiermax) AS order1, 
       ru.rul_ipk, 
       ru.rul_icontfk, 
       ru.rul_crultype, 
       ru.rul_cisbn, 
       ru.rul_crecipid, 
       ru.rul_ccalcmeth, 
       ru.rul_ctiertype, 
       ru.rul_ntiermax 
FROM   rules.ru 
       INNER JOIN ruletype rut 
               ON rut.rut_crultype = ru.rul_crultype 
       INNER JOIN country cnt 
               ON cnt.ctr_cisocode = ru.rul_cctry 
WHERE  ru.rul_icontfk = '108122' --and rul_ipk=1227754 
ORDER  BY order1  )

SELECT * FROM CTE 
WHERE order1 > row
于 2013-09-11T20:00:19.913 に答える