Пометить дублированные значения MySQL без использования GROUP BY - PullRequest
0 голосов
/ 01 апреля 2020

Не могли бы вы помочь пометить повторяющиеся значения в дополнительном столбце без группировки дублированных значений?

См. Пример данных (пример того, что у меня есть и чего мне нужно достичь справа):

enter image description here

Как видите, у меня есть ID продукта с суффиксом E (Мощность) и G (Газ). Некоторые идентификаторы продуктов дублируются: один и тот же идентификатор продукта - один с E , а второй с G составляет Двойной продукт .

Идентификатор продукта только с E делает Power_Only_product , ID продукта только с G делает Gas_Only_product , тот же ID продукта с E и G делает Двойной продукт .

Хитрость заключается в том, чтобы добавить столбец на нужном сайте с информацией о том, какой идентификатор является двойным продуктом, а какой - только питание или Только газ.

Можете ли вы помочь мне получить такой столбец без группировки идентификаторов продуктов? Заранее спасибо! Pawel

Ответы [ 3 ]

1 голос
/ 02 апреля 2020

Если вы используете MySQL 8.0, вы можете сделать это только с оконными функциями, без объединений, подзапросов или CTE.

Я бы предложил просто сравнить максимальное и минимальное значения product для каждого клиента; когда они различаются, у вас есть «двойной продукт».

select
    t.*,
    case when min(product) over(partition by customer_account) <> max(product) over(partition by customer_account)
        then 'Dual Product' 
        else concat(product, ' Only')
    end single_or_dual_product
from mytable t
0 голосов
/ 01 апреля 2020
SELECT t1.*,
       CASE WHEN t2.CustomerAccount IS NOT NULL
            THEN 'Dual Product'
            WHEN t1.Product = 'Gas'
            THEN 'Gas Only'
            WHEN t1.Product = 'Power'
            THEN 'Power Only'
            ELSE 'Wrong product type'
            END ProductType
FROM sourcetable t1
LEFT JOIN sourcetable t2 ON t1.CustomerAccount = t2.CustomerAccount
                        AND t1.Product != t2.Product    

Запрос НЕ использует ProductID и НЕ проверяет, соответствует ли он CustomerAccount и / или Product. Это будет лишняя работа без какой-либо прибыли.

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

Вы не упоминаете, какую базу данных вы используете, поэтому я предполагаю, что это MySQL 8.x.

Вероятно, лучше отделить ID от TYPE с помощью CTE , Тогда запрос становится намного проще. Например:

with
x as ( -- this CTE just to separate the ID from the TYPE
  select *,
    substring(productid, 1, char_length(productid) - 1) as id,
    right(productid, 1) as type
  from t
)
select x.*, case when y.id is null then 'Power Only' else 'Dual' end
from x
left join y on x.id = y.id and y.type = 'G'
where x.type = 'E'
union all
select x.*, case when y.id is null then 'Gas Only' else 'Dual' end
from x
left join y on x.id = y.id and y.type = 'E'
where x.type = 'G'
order by id, type

Обратите внимание, что я использую UNION ALL. Это потому, что MySQL (пока) не реализует FULL OUTER JOIN. Хитрость здесь в том, чтобы повторить запрос несколько в обратном порядке .

...