Oracle SQL 行号选择

Oracle SQL Row Number selection

下面的这些都与同一文件中的同一记录有关....基本上它被标记为 'UNK' 直到有人为其分配产品编号。在这种情况下,号码 12345678 是由 Paul 在 1 月 1 日分配的。每条记录 before/after 即有人对该记录进行了更改。

我想要的是捕获该记录,第一次从 UNK 变为数字...并从该行捕获用户名和日期等。

我已经尝试了 min, least,但我不确定 rownum 或如果我这样做的话应该把字符串放在哪里。

Car_Id    Product #     user name     date
111          unk           john          20Dec
111          unk           alan          25Dec
111          unk           pete          30Dec
111          12345678      paul          01Jan
111          12345678      jim           10Jan
222          unk           alan          25Dec
222          unk           pete          30Dec
222          87654321      paul          02Jan
222          87654321      steve         05Jan

但从逻辑上讲,我希望它这样做...给我 UNK 之后的第一条记录。

如果可能的话,请给我完整的字符串。

如果我错了请纠正我,但你的数据似乎是按日期排序的,所以从逻辑上讲你可以只取产品编号不是 "unk".

的第一个 recoredset
Select *
From (SELECT * FROM YourTable orderby date) t -- make sure data is ordered before selecting it
where t.ProductNr <> 'unk' and -- don't get data without a number
rownum = 1 -- take the first

听起来解析函数 row_number() 可能是执行此操作的最佳方法:

with sample_data as (select 111 car_id, 'unk' product#, 'john' user_name, to_date('20/12/2014 10:12:24', 'dd/mm/yyyy hh24:mi:ss') dt from dual union all
                     select 111 car_id, 'unk' product#, 'alan' user_name, to_date('21/12/2014 10:12:24', 'dd/mm/yyyy hh24:mi:ss') dt from dual union all
                     select 111 car_id, 'unk' product#, 'pete' user_name, to_date('22/12/2014 10:12:24', 'dd/mm/yyyy hh24:mi:ss') dt from dual union all
                     select 111 car_id, '12345678' product#, 'paul' user_name, to_date('23/12/2014 10:12:24', 'dd/mm/yyyy hh24:mi:ss') dt from dual union all
                     select 111 car_id, '12345678' product#, 'jim' user_name, to_date('24/12/2014 10:12:24', 'dd/mm/yyyy hh24:mi:ss') dt from dual union all
                     select 222 car_id, 'unk' product#, 'alan' user_name, to_date('25/12/2014 10:12:24', 'dd/mm/yyyy hh24:mi:ss') dt from dual union all
                     select 222 car_id, 'unk' product#, 'pete' user_name, to_date('26/12/2014 10:12:24', 'dd/mm/yyyy hh24:mi:ss') dt from dual union all
                     select 222 car_id, '87654321' product#, 'paul' user_name, to_date('27/12/2014 10:12:24', 'dd/mm/yyyy hh24:mi:ss') dt from dual union all
                     select 222 car_id, '87654321' product#, 'steve' user_name, to_date('28/12/2014 10:12:24', 'dd/mm/yyyy hh24:mi:ss') dt from dual)
select car_id,
       product#,
       user_name,
       dt
from   (select sd.*,
               row_number() over (partition by car_id order by dt) rn
        from   sample_data sd
        where  product# != 'unk')
where  rn = 1;

    CAR_ID PRODUCT# USER_NAME DT                   
---------- -------- --------- ---------------------
       111 12345678 paul      23/12/2014 10:12:24  
       222 87654321 paul      27/12/2014 10:12:24