Nano Hash - криптовалюты, майнинг, программирование

Подсчитайте количество обычных пользователей в нескольких таблицах

У меня есть 4 таблицы, как показано ниже

введите здесь описание изображения

В основном я хочу получить, сколько пользователей из таблицы 1 находится в таблицах 2, 3 и 4. Аналогично для таблицы 2 я хочу получить, сколько пользователей присутствует в таблицах 1, 3 и 4. и то же самое для таблиц 3 и 4

В общем, все возможные комбинации. Конечный результат, который я хочу, выглядит примерно так:

введите здесь описание изображения

Один из способов, который я пытаюсь решить, - это выполнить left-join из table1 с другими таблицами, за которыми следует count, чтобы получить первую строку моего вывода. Но делать это для всех возможных комбинаций неоптимально. Я искал любую другую альтернативу, которая возможна

Мой код для того же

SELECT 
COUNT(DISTINCT A.id) table1,
COUNT(DISTINCT B.id) table2,
COUNT(DISTINCT C.id) table3,
COUNT(DISTINCT D.id) table4
FROM table1 A
LEFT JOIN table2 B
ON A.id = B.id

LEFT JOIN table3 C
ON A.id = C.id

LEFT JOIN table4 D
ON A.id = D.id

db-fiddle (эта скрипка предназначена для mysql, я ищу общий Подход на основе SQL, чем любой подход, специфичный для БД)

27.07.2020

Ответы:


1

Я бы порекомендовал:

with t as (
      select 'table1' as which, id from table1 union all
      select 'table2' as which, id from table2 union all
      select 'table3' as which, id from table3 union all
      select 'table4' as which, id from table4
     )
select ta.which,
       sum(case when tb.which = 'table1' then 1 else 0 end) as cnt_table1,
       sum(case when tb.which = 'table2' then 1 else 0 end) as cnt_table2,
       sum(case when tb.which = 'table3' then 1 else 0 end) as cnt_table3,
       sum(case when tb.which = 'table4' then 1 else 0 end) as cnt_table4
from t ta left join
     t tb
     on ta.id = tb.id
group by ta.which;

Примечание. Предполагается, что id уникален в каждой из таблиц. Это разумное предположение, учитывая имя столбца и выборочные данные. Однако, если есть дубликаты, вы можете изменить union all в CTE на union.

Эта структура также легко обобщается на дополнительные таблицы.

27.07.2020
  • Это тот ответ/код, который я искал. Это выглядит намного чище, интеллектуальнее и значительно уменьшило длину кода. 27.07.2020

  • 2

    Используйте 1_

    ДЕМО

    select 'table1' as col1,count(table1.id),count(table2.id),count(table3.id),count(table4.id) 
    from table1
    left join table2 on table1.id=table2.id
    left join table3 on table1.id=table3.id
    left join table4 on table1.id=table4.id
    union all
    select 'table2' ,count(table1.id),count(table2.id),count(table3.id),count(table4.id) 
    from table2
    left join table1 on table2.id=table1.id
    left join table3 on table2.id=table3.id
    left join table4 on table2.id=table4.id
    union all
    select 'table3' ,count(table1.id),count(table2.id),count(table3.id),count(table4.id) 
    from table3
    left join table1 on table3.id=table1.id
    left join table2 on table3.id=table2.id
    left join table4 on table3.id=table4.id
    union all
    select 'table4' ,count(table1.id),count(table2.id),count(table3.id),count(table4.id) 
    from table4
    left join table1 on table4.id=table1.id
    left join table2 on table4.id=table2.id
    left join table3 on table4.id=table3.id
    

    ВЫХОД:

    col1    tbl1    tbl2    tbl3    tbl4
    table1   8      3        2       2
    table2   3      6        1       0
    table3   2      1        5       0
    table4   2      0        0       4
    
    27.07.2020
  • Мне все равно придется писать код 4 раза для 4 таблиц. Я эт у меня › 20 таких таблиц. Я искал подход, который уменьшит длину кода. Я проголосовал за ответ за ваши усилия 27.07.2020
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

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

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..