Как я могу заставить работать левое соединение только тогда, когда количество записей в первой таблице больше или равно количеству записей во второй таблице? - PullRequest
0 голосов
/ 06 октября 2019

У меня есть две таблицы, и я хочу сделать левое соединение между ними, , но Я хочу, чтобы левое соединение произошло, только если число записей, содержащих одинаковое значение столбца соединения в первой таблице, большеили равно количеству записей, которые содержат одинаковое значение столбца соединения во второй таблице

что я пытаюсь:

сначала я делаю количество записей для каждогогруппа

и затем я ставлю условие для фильтрации ( a.cnt> = b.cnt )

это код:

insert into work.discount_tmp 
select SubsID, MSISDN, EppAcc, User_Name, Bill_Cycle, Tariff, Pack, Discount_Qual_ID, 
Discount_ID, Qualification_Type, Discount_Desc, Sequence, a.GroupID, RuleID, 
dib_band_id, dib_band_end, dib_charge_ref, DIB_DIS0, dib_disc_type, dib_limit_disc, 
DIB_MAX_, cd_class_type, ClassID, Class, dgh_group_id, dgh_inclusion_from, 
dgh_inclusion_to, 20191003 
from (
  (
    select *, 
      row_number() over (partition by GroupID order by Discount_ID) as seqnum,
      COUNT(*) over (partition by GroupID order by GroupID) as cnt 
    from work.disc_band 
    where tbl_dt = 20191003 
    order by Discount_ID
  ) a
  left join (
    select *, 
      row_number() over (
        partition by GroupID 
        order by cd_class_type, try(cast(coalesce(classid,'0') as bigint))
      ) as seqnum,
      count(*) over (partition by GroupID order by GroupID) as cnt 
    from work.alltable1 
    where tbl_dt = 20191003 
  ) b on a.GroupID = b.GroupID and a.cnt >= b.cnt and a.seqnum = b.seqnum
); 

Но моя попытка не работает, потому что сначала выполнено объединение, а затем условие (поэтому значение cnt во второй таблице не останется прежним после объединения)

Есть идеи, как заставить это работать?

1 Ответ

0 голосов
/ 06 октября 2019

Вы хотите написать свой запрос, ссылаясь на нейтральную «начальную таблицу» в предложении FROM. Затем вы можете рассчитать количество строк из двух таблиц и сравнить их друг с другом. Примерно так:

insert into work.discount_tmp 
select SubsID, MSISDN, EppAcc, User_Name, Bill_Cycle, Tariff, Pack, Discount_Qual_ID, 
Discount_ID, Qualification_Type, Discount_Desc, Sequence, a.GroupID, RuleID, 
dib_band_id, dib_band_end, dib_charge_ref, DIB_DIS0, dib_disc_type, dib_limit_disc, 
DIB_MAX_, cd_class_type, ClassID, Class, dgh_group_id, dgh_inclusion_from, 
dgh_inclusion_to, 20191003 
from (
  select a.*, b.*, 
  FROM (SELECT 1 AS DummyCol) AS dt -- "seed" table; not sure the Presto equivalent
  CROSS JOIN ( -- Get all qualifying rows from "disc_band"
    SELECT *, count(*) OVER(PARTITION BY groupid) AS RowCount
    FROM work.disc_band
    WHERE tbl_dt = 20191003
  ) a
  LEFT JOIN ( -- Get all qualifying rows from "alltable1"
    SELECT *, count(*) OVER(PARTITION BY groupid) AS RowCount
    FROM work.alltable1
    WHERE tbl_dt = 20191003
  ) b ON a.groupid = b.groupid AND a.RowCount >= b.RowCount
) src

Я не уверен насчет логики seqnum, поэтому вы можете добавить ее обратно, если это необходимо.

Я не проверял ее, и вывозможно, придется поработать с синтаксисом, чтобы заставить его работать с Presto. Дайте ему шанс и дайте мне знать.

...