SQL: объединение LIKE, Not LIKE и IN, а затем выбор последних данных - PullRequest
0 голосов
/ 12 января 2019

У меня есть таблица ниже:

table1:

filename    File_ID date    version
Broker1_file_12312  5093    20180108    1
Broker1_file_1sa3e_Renamed  3956    20180108    2
Broker2_file_d3223f 3109    20180108    1
Broker2_file_j3df   4526    20180108    2
Broker2_file_dj3498_interest    3574    20180108    3
Broker3_file_fj934f 5603    20180108    1
Broker3_file_jdf34f 5225    20180108    1
Broker3_file_K9d043 5926    20180108    1
Broker4_file_c34km  4865    20180108    1
Broker5_file_cf4k3  3212    20180108    1

Мне нужно выбрать «имя файла» и «file_ID» в выводе на основе условий:

  1. имя файла должно совпадать со списком шаблонов, но не должно содержать значений из другого списка шаблонов
  2. версия должна быть последней, т.е. max (версия)
  3. Если шаблон не совпадает (ошибка 1) или существует более 1 файла (ошибка 2), это может показать эту ошибку.

Приведенный ниже код работает, но я не могу включить функцию «не нравится» и, выбирая последнюю версию


    SELECT t1.file_id, vals.val
    FROM
        table1 t1
        INNER JOIN  (VALUES ('Broker1'), ('Broker2'), ('Broker3'),('Broker4'),('Broker'),('Broker5')) Vals(val) 
            ON  t1.column1 LIKE '%' + vals.val + '%' 

Мне нужен вывод, чтобы он НЕ выбирал file_ID, где filename содержит строку «Renamed» для Broker1 и «интереса» для Broker2. Также мне нужно выбрать последнюю версию.

Так что из вышесказанного нужен вывод на основе приведенных ниже комментариев:

filename    File_ID date    version Comment
Boker1_file_12312   4007    20180108    1   To be shown in output
Boker1_file_1sa3e_Renamed   5147    20180108    2   Not be shown in output
Boker2_file_d3223f  3496    20180108    1   Not be shown in output
Boker2_file_j3df    3880    20180108    2   To be shown in output
Boker2_file_dj3498_interest 5817    20180108    3   Not be shown in output
Boker3_file_fj934f  4541    20180108    1   Not be shown in output
Boker3_file_jdf34f  5818    20180108    2   Not be shown in output
Boker3_file_K9d043  4910    20180108    3   To be shown in output
Boker4_file_c34km   3101    20180108    1   Not be shown in output
Boker5_file_cf4k3   5209    20180108    1   Not be shown in output

Окончательный вывод:

val File_ID
Boker1  4007
Boker2  3880
Boker3  4910
Boker4  3101
Broker  error1
Broker5  error2

Я пытаюсь добавить последнюю версию из следующего кода:

select file_id from table1 as t
where date = '20190108'
and filename like ('%Broker1%')
and t.version = (select max(version) from table1 as t2
where t2.date = t.date
and t2.filename like  t.filename
)

Ответы [ 2 ]

0 голосов
/ 12 января 2019

просто вставьте еще одно внутреннее соединение

SELECT t1.file_id, vals.val, max(version) over (partition by t1.file_id) version
FROM
    table1 t1
    INNER JOIN  (VALUES ('Broker1'), ('Broker2'), ('Broker3'),('Broker4')) Vals(val) 
        ON  t1.column1 LIKE '%' + vals.val + '%' 
    INNER jOIN (VALUES ('Broker1'), ('Broker2'), ('Broker3'),('Broker4')) Vals2(val) 
        ON  t1.column1 NOT LIKE '%' + vals2.val + '%' 

или с группой по

SELECT t1.file_id, vals.val, max(version)
FROM
    table1 t1
    INNER JOIN  (VALUES ('Broker1'), ('Broker2'), ('Broker3'),('Broker4')) Vals(val) 
        ON  t1.column1 LIKE '%' + vals.val + '%' 
    INNER jOIN (VALUES ('Broker1'), ('Broker2'), ('Broker3'),('Broker4')) Vals2(val) 
        ON  t1.column1 NOT LIKE '%' + vals2.val + '%' 
group by t1.file_id, vals.val
0 голосов
/ 12 января 2019

Чтобы отфильтровать записи, имя файла которых не соответствует ни шаблону '%Broker1%Renamed%', ни шаблону 'Broker2%interest', вы можете просто добавить еще один JOIN к вашему запросу.

SELECT vals.val broker_name, t1.file_id
FROM
    table1 t1
    INNER JOIN  (VALUES ('Broker1'), ('Broker2'), ('Broker3'),('Broker4')) Vals(val) 
        ON t1.column1 LIKE '%' + vals.val + '%' 
    INNER JOIN  (VALUES ('Broker1%Renamed'), ('Broker2%interest')) NotVals(val) 
        ON t1.filename NOT LIKE '%' + NotVals.val + '%' 

EDIT

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

WITH cte AS (
    SELECT vals.val broker_name, t1.file_id, t1.version
    FROM
        table1 t1
        INNER JOIN  (VALUES ('Broker1'), ('Broker2'), ('Broker3'),('Broker4')) Vals(val) 
            ON t1.column1 LIKE '%' + vals.val + '%' 
        INNER JOIN  (VALUES ('Broker1%Renamed'), ('Broker2%interest')) NotVals(val) 
            ON t1.filename NOT LIKE '%' + NotVals.val + '%' 
)
SELECT *
FROM 
    cte
    INNER JOIN (SELECT broker_name, MAX(version) version FROM cte GROUP BY broker_name) ctemax 
        ON ctemax.broker_name = cte.broker_name 
        AND ctemax.version = cte.version
...