Reputation: 1
LotNumber Device MeasureDate RowNumber
LotA DevA 10/1/15 0:00 1
LotA DevA 10/1/15 1:00 1
LotA DevB 10/1/15 2:00 2
LotB DevA 10/1/15 3:00 3
LotB DevA 10/1/15 4:00 3
LotA DevA 10/1/15 5:00 4
I want to generate the RowNumber column based on group of LotNumber and Device.As long as the lot and device is the same, the rownumber will be the same. The order is by measuredate.
Upvotes: 0
Views: 5466
Reputation: 523
Use Dense_rank to get desired output.
create table device (lotnumber varchar2(5), device varchar2(5), measuredate date);
insert into device values ('LotA','DevA', sysdate);
insert into device values ('LotA','DevA', sysdate);
insert into device values ('LotA','DevB', sysdate);
insert into device values ('LotB','DevA', sysdate);
insert into device values ('LotB','DevA', sysdate);
insert into device values ('LotA','DevA', sysdate);
Use below query to get desired output.
SELECT * FROM (SELECT DEVICE.*, DENSE_RANK() OVER(ORDER BY LOTNUMBER, DEVICE) RM FROM DEVICE) ;
Upvotes: 0
Reputation: 1478
If you just want to generate rownumbers the same as what is displayed. You can try this
SELECT Lotnumber,
Device,
MeasureDate,
DENSE_RANK() OVER (ORDER BY MEASURE DATE ) AS RowNumber
FROM TABLE
Upvotes: 0
Reputation: 36483
This can be done by using the LAG
analytic function in an inline view, followed by a cumulative sum to only sum when the values differ from the previous row.
select lot_number,
device,
measure_date
sum(case when last_lot_number = lot_number and last_device = device
then 0
else 1 end) over (order by measure_date) as row_number
from (select lot_number,
device,
measure_date,
lag(lot_number) over(order by measure_date) as last_lot_number,
lag(device) over(order by measure_date) as last_device
from your_table)
order by measure_date
Upvotes: 1