Расчет записей, потерянных и полученных от сборки контента до сборки контента - PullRequest
0 голосов
/ 19 сентября 2018

У меня есть запрос, который я написал, который по существу находит записи, присутствующие в новой сборке контента, которых не было в предыдущей сборке контента.Я знаю, что это работает правильно, но теперь мне нужно отменить его, чтобы найти записи, присутствующие в предыдущей сборке контента, которые не попали в новую сборку контента.Выполняет ли второй запрос, приведенный ниже, это?

select b1.judge_id, count(*) as opinions_gain
from
    (select build_opinion.build_name, judge_id, parse_type, opinion_id, date, new_jdx
    from build_opinion, build_flow
    where build_opinion.build_name = build_flow.previous and judge_id is not null) as b0
right join
    (select build_opinion.build_name, judge_id, parse_type, opinion_id, date, new_jdx
    from build_opinion, build_flow
    where build_opinion.build_name = build_flow.current and judge_id is not null) as b1
on b0.opinion_id = b1.opinion_id
where b1.judge_id != b0.judge_id
group by b1.judge_id
order by opinions_gain desc
;

select b0.judge_id, count(*) as opinions_lost
from
    (select build_opinion.build_name, judge_id, parse_type, opinion_id, date, new_jdx
    from build_opinion, build_flow
    where build_opinion.build_name = build_flow.previous and judge_id is not null) as b0
left join
    (select build_opinion.build_name, judge_id, parse_type, opinion_id, date, new_jdx
    from build_opinion, build_flow
    where build_opinion.build_name = build_flow.current) as b1
on b0.opinion_id = b1.opinion_id
where b0.judge_id != b1.judge_id
group by b0.judge_id
order by opinions_lost desc
;

Кроме того, что было бы наиболее логичным способом получить больше информации о тех записях, которые считаются полученными или потерянными?Использование этих запросов в подзапросе «with, as»?

Схема таблицы build_opinion (другая таблица, build_flow_moondoor, это просто таблица, которая сообщает, как называются предыдущие, текущие и следующие имена сборок):

build_name character varying(32),
opinion_id character varying(32),
date timestamp without time zone,
name character varying(32768),
nickname character varying(8192),
docket_number character varying(32768),
parse_type character varying(32),
source_jdx character varying(256),
judge_name_hint character varying(8192),
first_page character varying(1024),
dupe_of character varying(32),
source_id character varying(256),
new_jdx character varying(1024),
court character varying(4096),
judge_id character varying(128),
topic character varying(64),
page_count smallint,
scanned_page_count smallint,
sentences_count smallint,
body_character_count integer,
key_phrase_count smallint,
cited_count integer,
cites_raw_count smallint,
cites_resolved_count smallint,
law_firm_count smallint,
counsels_count integer,
outcome_count smallint,
nature_of_suit smallint,
cause_of_action character varying(256),
CONSTRAINT build_opinion_pkey PRIMARY KEY (build_name, opinion_id)

Ответы [ 3 ]

0 голосов
/ 21 сентября 2018

Redshift поддерживает full outer join, поэтому я предлагаю вам попробовать все еще, используя 2 подзапроса в качестве источников, например,

SELECT
    COALESCE(prevbuild.judge_id,currbuild.judge_id) judge_id
  , COUNT(case when prevbuild.judge_id = currbuild.judge_id then 1 end) AS opinions_shared
  , COUNT(case when prevbuild.opinion_id IS NULL then 1 end)     AS currbuild_only_options
  , COUNT(case when currbuild.opinion_id IS NULL then 1 end)     AS prevbuild_only_options
FROM (
    SELECT
        build_opinion.build_name
      , COALESCE(judge_id, 'prevbuild-null') judge_id
      , parse_type
      , opinion_id
      , date
      , new_jdx
    FROM build_opinion
    INNER JOIN build_flow ON build_opinion.build_name = build_flow.previous
    ) AS prevbuild
FULL OUTER JOIN (
    SELECT
        build_opinion.build_name
      , COALESCE(judge_id, 'currbuild-null') judge_id
      , parse_type
      , opinion_id
      , date
      , new_jdx
    FROM build_opinion
    INNER JOIN build_flow ON build_opinion.build_name = build_flow.current
    ) AS currbuild ON prevbuild.opinion_id = currbuild.opinion_id
GROUP BY
    COALESCE(prevbuild.judge_id,currbuild.judge_id)
0 голосов
/ 28 сентября 2018

Чтобы использовать полное внешнее объединение для деталей вместо подсчетов, я предлагаю следующее:

/ * текущая сборка * /

SELECT
    currbuild.*
FROM (
    SELECT
        build_opinion.build_name
      , COALESCE(judge_id, 'prevbuild-null') judge_id
      , parse_type
      , opinion_id
      , date
      , new_jdx
    FROM build_opinion
    INNER JOIN build_flow ON build_opinion.build_name = build_flow.previous
    ) AS prevbuild
FULL OUTER JOIN (
    SELECT
        build_opinion.build_name
      , COALESCE(judge_id, 'currbuild-null') judge_id
      , parse_type
      , opinion_id
      , date
      , new_jdx
    FROM build_opinion
    INNER JOIN build_flow ON build_opinion.build_name = build_flow.current
    ) AS currbuild ON prevbuild.opinion_id = currbuild.opinion_id
WHERE prevbuild.opinion_id IS NULL
;

/ * предыдущая сборка * /

SELECT
    prevbuild.*
FROM (
    SELECT
        build_opinion.build_name
      , COALESCE(judge_id, 'prevbuild-null') judge_id
      , parse_type
      , opinion_id
      , date
      , new_jdx
    FROM build_opinion
    INNER JOIN build_flow ON build_opinion.build_name = build_flow.previous
    ) AS prevbuild
FULL OUTER JOIN (
    SELECT
        build_opinion.build_name
      , COALESCE(judge_id, 'currbuild-null') judge_id
      , parse_type
      , opinion_id
      , date
      , new_jdx
    FROM build_opinion
    INNER JOIN build_flow ON build_opinion.build_name = build_flow.current
    ) AS currbuild ON prevbuild.opinion_id = currbuild.opinion_id
WHERE currbuild.opinion_id IS NULL
;

/ * общие предметы * /

SELECT
    currbuild.*
FROM (
    SELECT
        build_opinion.build_name
      , COALESCE(judge_id, 'prevbuild-null') judge_id
      , parse_type
      , opinion_id
      , date
      , new_jdx
    FROM build_opinion
    INNER JOIN build_flow ON build_opinion.build_name = build_flow.previous
    ) AS prevbuild
FULL OUTER JOIN (
    SELECT
        build_opinion.build_name
      , COALESCE(judge_id, 'currbuild-null') judge_id
      , parse_type
      , opinion_id
      , date
      , new_jdx
    FROM build_opinion
    INNER JOIN build_flow ON build_opinion.build_name = build_flow.current
    ) AS currbuild ON prevbuild.opinion_id = currbuild.opinion_id
WHERE currbuild.opinion_id = prevbuild.opinion_id
;
0 голосов
/ 19 сентября 2018

Это немного сложно догадаться без схем таблиц.

Однако попытка, основанная на предположениях, которые могут дать вам оба в одном и том же запросе, заключается в следующем.Это синтаксис сервера SQL, я думаю, он также будет работать в MySQL.

;with j as(
    select oc.judget_id as cj, op.Judge_id as pj
    from build_flow f
    join build_opinion oc on oc.build_name=f.current
    join build_opinion op on op.build_name=f.previous
)
select judge_id, sum(gain) as gain, sum(lost) as lost
from 
    (
    select cj as judge_id, count(*) as gain, 0 as lost 
    from j
    where cj<>pj
    group by cj
    union all 
    select pj as judge_id, 0 as gain, count(*) as lost 
    from j
    where cj<>pj
    group by pj
) q
group by judge_id
...