Oracle SQL行号选择

时间:2015-02-19 10:23:54

标签: sql oracle rownum

以下所有内容都涉及同一档案中的相同记录....基本上它标有' UNK'直到有人为其分配产品编号。在这种情况下,编号12345678由保罗在01Jan指定。之前/之后的每条记录都是有人在该记录上进行了更改。

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

我已经尝试过min,至少,我不确定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之后给我第一张唱片。

如果可能,我可以提供完整的字符串。

2 个答案:

答案 0 :(得分:2)

如果我错了,请纠正我,但是您的数据似乎是按日期排序的,所以从逻辑上讲,您可以采取第一个recoredset,其中productnumber不是“unk”。

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

答案 1 :(得分:1)

听起来像分析函数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