Skip to content
Advertisement

How to get unique value in Oracle

My Query:

select unique f.documentname,f.projectname,f.documentdescription,
f.P0BUSINESSUNIT,f.P0ZONENAME,f.P0REGIONNAME,f.P0GROUPNAME,l.processname,
f.ORIGINALCREATIONDATE 
from p0findoc f, lcstep@sdrcpadm l 
where f.inlifecyclename IS Not Null and 
f.INLIFECYCLESTEP in (select l.LIFECYCLESTEP  from lcstep@sdrcpadm ) and ORIGINALCREATIONDATE > '2021/01/01' 
order by f.P0BUSINESSUNIT,f.P0ZONENAME,f.P0REGIONNAME,f.P0GROUPNAME ;

Output:

DocumentName, Project Name, Doc Description...so on

PD71017 311503  Change Order 1  CIS Americas CIS    Brazil CIS  Not Applicable  Deliver Services    2021/05/04-14:50:07:998

PD71017 311503  Change Order 1  CIS Americas CIS    Brazil CIS  Not Applicable  Notification    2021/05/04-14:50:07:998

PD71017 311503  Change Order 1  CIS Americas CIS    Brazil CIS  Not Applicable  PRJ Notification    2021/05/04-14:50:07:998

PD71017 311503  Change Order 1  CIS Americas CIS    Brazil CIS  Not Applicable  Request CSS Closure 2021/05/04-14:50:07:998

PD71017 311503  Change Order 1  CIS Americas CIS    Brazil CIS  Not Applicable  Validation Failure  2021/05/04-14:50:07:998

PD73834 311503  Change Order 4  CIS Americas CIS    Brazil CIS  Not Applicable  Deliver Services    2021/09/13-17:24:18:433

PD73834 311503  Change Order 4  CIS Americas CIS    Brazil CIS  Not Applicable  Notification    2021/09/13-17:24:18:433

Here in above output i want to have unique value only for column ‘document name’ that is PDxxxx. there are multiple values for column process name so wanted to have just one.

Advertisement

Answer

If you want one (any) process name, then take e.g. “first” or “last” (min or max), but you’ll have to aggregate on all other columns (which also means that you don’t need unique any more):

  SELECT f.documentname,
         f.projectname,
         f.documentdescription,
         f.p0businessunit,
         f.p0zonename,
         f.p0regionname,
         f.p0groupname,
         MAX (l.processname) processname,
         f.originalcreationdate
    FROM p0findoc f
         JOIN lcstep@sdrcpadm l ON f.inlifecyclestep = l.lifecyclestep
   WHERE     f.inlifecyclename IS NOT NULL
         AND originalcreationdate > DATE '2021-01-01'
GROUP BY f.documentname,
         f.projectname,
         f.documentdescription,
         f.p0businessunit,
         f.p0zonename,
         f.p0regionname,
         f.p0groupname,
         f.originalcreationdate
ORDER BY f.p0businessunit,
         f.p0zonename,
         f.p0regionname,
         f.p0groupname;

Also, you’d rather not compare dates to strings; that’s why I used date literal in where clause. Finally, switched to JOIN.

User contributions licensed under: CC BY-SA
7 People found this is helpful
Advertisement