Oracle запрос на возврат значений из столбца 1 для определенных значений в столбце 2 - PullRequest
1 голос
/ 15 апреля 2020

У меня есть оператор, который получает данные из 4 таблиц. Результат этого выбора предоставит мне необходимую информацию с самого начала. Затем у меня есть второй оператор select, в котором я хочу отфильтровать эти результаты.

оператор выглядит следующим образом

WITH temp
     AS (SELECT "username",
                Max("session_start_time") AS "START_TIME",
                "product_name"
         FROM   (SELECT "PPM"."ppm_logon_sessions"."session_start_time" AS
                        "SESSION_START_TIME",
                        "PPM"."ppm_logon_sessions"."username"           AS
                        "USERNAME"
                        ,
                        "PPM"."ppm_logon_sessions"."user_id"
                        AS "USER_ID",
                        "Knta User Products"."product_id"               AS
                        "PRODUCT_ID",
                        "Knta User Products"."user_id"                  AS
                        "USER_ID_2",
                        "Knta User Products"."user_product_id"          AS
                        "USER_PRODUCT_ID",
                        "Knta License Usage V"."product_name"           AS
                        "PRODUCT_NAME"
                 FROM   "PPM"."ppm_logon_sessions"
                        left join "PPM"."knta_user_products"
                                  "Knta User Products"
                               ON "PPM"."ppm_logon_sessions"."user_id" =
                                  "Knta User Products"."user_id"
                        left join "PPM"."knta_license_usage_v"
                                  "Knta License Usage V"
                               ON "Knta User Products"."product_id" =
                                  "Knta License Usage V"."product_id")
         GROUP  BY "username", "product_name")
SELECT "username", "product_name"
FROM   temp
WHERE  "start_time" > Trunc(Cast(SYSDATE AS TIMESTAMP)
                            + Numtodsinterval(-30, 'day'), 'day')
       AND "product_name" IS NOT NULL

Теперь это вернет набор результатов, который выглядит следующим образом:

output of query

что я хотел бы сделать, если я возвращаю только те имена пользователей, которые существуют только в определенных продуктах, например, если я хочу отфильтровать только тех пользователей, которые иметь "Configuration" и "User Administration" product_names, которые должны давать мне только те пользователи, а не пользователи, которые имеют "Configuration" и "User Administration" и "Program Management"

1 Ответ

0 голосов
/ 15 апреля 2020

Вы можете сделать это, используя LEAD и LAG аналитические функции.

Демо:

В приведенных ниже примерах данных он вернет только username, который имеет продукт только в 'Configuration', 'User Administration' и фильтрует, если другие:

with t AS
( 
  select 'mat_m' username, 'Configuration' product_name from dual
  union all
  select 'mat_m' username, 'Program Management' product_name from dual
  union all
  select 'mat_m' username, 'Project Management' product_name from dual
  union all
  select 'nel_d' username, 'User Administration' product_name from dual
  union all
  select 'nel_d' username, 'Program Management' product_name from dual
  union all
  select 'nel_d' username, 'Portfolio Management' product_name from dual
  union all
  select 'puth_a' username, 'Configuration' product_name from dual
  union all
  select 'puth_a' username, 'User Administration' product_name from dual
 )
 SELECT username, product_name
 FROM(
    SELECT username, 
           product_name,
           lead(product_name) over(partition by username order by product_name) lead,
           lag(product_name) over(partition by username order by product_name) lag
    FROM t
    )
WHERE product_name IN ('Configuration', 'User Administration')
AND 
(
    lag IN ('Configuration', 'User Administration')
  OR
    lead IN ('Configuration', 'User Administration')
);

Выход:

USERNAME PRODUCT_NAME        
-------- --------------------
puth_a   Configuration       
puth_a   User Administration
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...