Home > Net >  FIltering result from query
FIltering result from query

Time:10-15

This query return users from database MariaDB (MySql). I need to remove rows from result, where in surname is added "(old)" OR "- R". How to edit a query?

SELECT au.id,
       au.name,
       au.surname
FROM statements s 
JOIN aduser au ON au.id=s.id_usp
WHERE s.id_utv = 10
GROUP BY au.surname
ORDER BY au.surname ASC

From this result of query:

id name surname
124 Mike Argle
221 Mike Argle (old)
138 Lisa Doe
126 Lisa Doe (old)
123 John Harris
135 John Harris - R
324 Ann Perez
329 Tiffani Perez

To this result. Query should return this result:

id name surname
124 Mike Argle
138 Lisa Doe
123 John Harris
324 Ann Perez
329 Tiffani Perez

CodePudding user response:

You can use a ROW_NUMBER window function to select the first value among the name ' - R'/' (old)' doubled values.

WITH cte AS (
    SELECT *, ROW_NUMBER() OVER(
                  PARTITION BY name, surname REGEXP name ' (- R|(old))'  
                  ORDER BY surname) AS rn
    FROM tab
)
SELECT id, name, surname
FROM cte
WHERE rn = 1

Check the demo here.


Your query would get updated as such:

WITH cte AS (
    SELECT au.id,
           au.name,
           au.surname,
           ROW_NUMBER() OVER(
               PARTITION BY au.name, au.surname REGEXP au.name ' (- R|(old))'  
               ORDER BY au.surname) AS rn
    FROM statements s 
    JOIN aduser au ON au.id=s.id_usp
    WHERE s.id_utv = 10
)
SELECT id, name, surname
FROM cte
WHERE rn = 1
ORDER BY surname ASC

CodePudding user response:

Change

WHERE s.id_utv = 10

To

WHERE s.id_utv = 10 AND INSTR(au.surename,'(old') = 0

  • Related