2

location numberこれは非常に単純な質問のようですが、以下を取得し、最初の実行で1、2であるフィールドをDAL追加する1パス(私の目には1パス)のSQLクエリを理解できません。BOSを実行し、次の実行のために3を実行しDALます。最初のパーティションにラベルを付ける方法を知っています(2つ使用してROW_NUMBER()ください)。

+---------+--------+-----------+----------+
| ITEM_ID | LOT_ID | ORGN_CODE | TRANS_ID |
+---------+--------+-----------+----------+
|      61 |  15161 | DAL       |   992342 |
|      61 |  15161 | DAL       |   992347 |
|      61 |  15161 | DAL       |  1043941 |
|      61 |  15161 | BOS       |  1061565 |
|      61 |  15161 | BOS       |  1064997 |
|      61 |  15161 | BOS       |  1064998 |
|      61 |  15161 | BOS       |  1064999 |
|      61 |  15161 | BOS       |  1065000 |
|      61 |  15161 | BOS       |  1065036 |
|      61 |  15161 | BOS       |  1065062 |
|      61 |  15161 | BOS       |  1065063 |
|      61 |  15161 | DAL       |  1065184 |
|      61 |  15161 | DAL       |  1065185 |
|      61 |  15161 | DAL       |  1065186 |
|      61 |  15161 | DAL       |  1065197 |
|      61 |  15161 | DAL       |  1065198 |
|      61 |  15161 | DAL       |  1083864 |
|      61 |  15161 | DAL       |  1083865 |
+---------+--------+-----------+----------+
4

3 に答える 3

5

次のようにしてみてください。

SELECT  *
    ,   DENSE_RANK() OVER(Order By GroupOrder) As GroupSequence
FROM (
    SELECT *,
        ROW_NUMBER() OVER(Order By TRANS_ID)
        -   ROW_NUMBER() OVER(Partition By ORGN_CODE Order By TRANS_ID)
            As GroupOrder
    FROM    yourTable
    )       As grp

1 回のパスのみで、カーソルはありません。SQL Server (tsql) では、これはソース テーブルの 1 回のスキャンに準拠します。

于 2012-07-26T03:02:13.557 に答える
3

これをPostgresqlで実行しました。おそらく、rdbms に適用できます。アイデアは、分析関数を使用して前のレコードの orgn_code を判別することです。次に、各行が前のコードと同じかどうかにかかわらず、それぞれ 0 または 1 でマークします。この列を合計すると、増加する数値が得られます。

create table transaction( ITEM_ID int, LOT_ID int, ORGN_CODE text, TRANS_ID int);

insert into transaction values(61, 1561,  'DAL', 992342 );
insert into transaction values(61, 1561,  'DAL', 992347 );
insert into transaction values(61, 1561,  'DAL', 1043941 );
insert into transaction values(61, 1561,  'BOS', 1061565 );
insert into transaction values(61, 1561,  'BOS', 1064997 );
insert into transaction values(61, 1561,  'BOS', 1064998 );
insert into transaction values(61, 1561,  'BOS', 1064999 );
insert into transaction values(61, 1561,  'BOS', 1065000 );
insert into transaction values(61, 1561,  'BOS', 1065036 );
insert into transaction values(61, 1561,  'BOS', 1065062 );
insert into transaction values(61, 1561,  'DAL', 1065063 );
insert into transaction values(61, 1561,  'DAL', 1065184 );
insert into transaction values(61, 1561,  'DAL', 1065185 );
insert into transaction values(61, 1561,  'DAL', 1065186 );
insert into transaction values(61, 1561,  'DAL', 1065197 );
insert into transaction values(61, 1561,  'DAL', 1065198 );
insert into transaction values(61, 1561,  'DAL', 1083864 );
insert into transaction values(61, 1561,  'DAL', 1083865 );

SELECT item_id, lot_id, orgn_code, trans_id
      ,SUM( CASE WHEN orgn_code = previous_orgn_code THEN 0 ELSE 1 END ) OVER(order by item_id, lot_id, trans_id) + 1 AS counter
  FROM ( SELECT item_id, lot_id, orgn_code, trans_id
               ,COALESCE( LAG(orgn_code) OVER(order by item_id, lot_id, trans_id)
                         ,orgn_code ) AS previous_orgn_code
           FROM transaction ) x
  ORDER BY item_id, lot_id, trans_id, orgn_code;

結果:

61  1561  "DAL"  992342   1
61  1561  "DAL"  992347   1
61  1561  "DAL"  1043941  1
61  1561  "BOS"  1061565  2
61  1561  "BOS"  1064997  2
61  1561  "BOS"  1064998  2
61  1561  "BOS"  1064999  2
61  1561  "BOS"  1065000  2
61  1561  "BOS"  1065036  2
61  1561  "BOS"  1065062  2
61  1561  "DAL"  1065063  3
61  1561  "DAL"  1065184  3
61  1561  "DAL"  1065185  3
61  1561  "DAL"  1065186  3
61  1561  "DAL"  1065197  3
61  1561  "DAL"  1065198  3
61  1561  "DAL"  1083864  3
61  1561  "DAL"  1083865  3
于 2012-07-26T02:14:34.063 に答える
0

どうぞ:

create table transactions( ITEM_ID int, LOT_ID int, ORGN_CODE varchar(10), TRANS_ID int);

insert into transactions values(61, 1561,  'DAL', 992342 );
insert into transactions values(61, 1561,  'DAL', 992347 );
insert into transactions values(61, 1561,  'DAL', 1043941 );
insert into transactions values(61, 1561,  'BOS', 1061565 );
insert into transactions values(61, 1561,  'BOS', 1064997 );
insert into transactions values(61, 1561,  'BOS', 1064998 );
insert into transactions values(61, 1561,  'BOS', 1064999 );
insert into transactions values(61, 1561,  'BOS', 1065000 );
insert into transactions values(61, 1561,  'BOS', 1065036 );
insert into transactions values(61, 1561,  'BOS', 1065062 );
insert into transactions values(61, 1561,  'DAL', 1065063 );
insert into transactions values(61, 1561,  'DAL', 1065184 );
insert into transactions values(61, 1561,  'DAL', 1065185 );
insert into transactions values(61, 1561,  'DAL', 1065186 );
insert into transactions values(61, 1561,  'DAL', 1065197 );
insert into transactions values(61, 1561,  'DAL', 1065198 );
insert into transactions values(61, 1561,  'DAL', 1083864 );
insert into transactions values(61, 1561,  'DAL', 1083865 );

;WITH main as (select ROW_NUMBER() over (order by (select 0)) as sno,ITEM_ID,LOT_ID,ORGN_CODE,TRANS_ID from transactions)

,CTE as (
select sno,ITEM_ID,LOT_ID,ORGN_CODE,TRANS_ID,1 as seq from main where sno=1
union all
select t.sno,t.ITEM_ID,t.LOT_ID,t.ORGN_CODE ,t.TRANS_ID,CASE when c.ORGN_CODE=t.ORGN_CODE then seq else seq+1 end 
from main t inner join CTE c on  t.sno-1 =c.sno

)
SELECT * FROM CTE
于 2012-07-26T05:22:28.173 に答える