Как сделать динамическое ограничение предложения WHERE на уровне идентификатора - PullRequest
0 голосов
/ 16 апреля 2019

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

Таблица A выглядит следующим образом с несколькими идентификаторами:

ID - Create date
12221 - 12/12/2018
13331 - 12/10/2018

Таблица B содержит следующую информацию с несколькими идентификаторами

ID - Date
12221 - 10/10/2018
12221 - 07/06/2017
13331 - 01/20/2019

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

ID - Count
12221 - 2
13331 - 0

Не уверен, как это сделать в SQL с предложением WHERE.Я мог бы потенциально ввести «дату создания» в качестве нового столбца в Таблице B и обойти ее (например, 1, если дата меньше, чем дата создания, и 0, если дата больше, чем дата создания), а затем поместить это в предложение WHERE., но поскольку у меня есть тонна данных, это не идеальное решение.

Спасибо!

Ответы [ 5 ]

1 голос
/ 16 апреля 2019

Присоединяйтесь к таблицам и группируйте с условием на даты:

select b.id, sum(a.createdate is not null) count
from tableb b left join tablea a
on a.id = b.id and b.date < a.createdate
group by b.id

См. Демоверсию .Результаты:

| id    | count |
| ----- | ----- |
| 12221 | 2     |
| 13331 | 0     |
0 голосов
/ 16 апреля 2019
select a.id, IFNULL((select count(b.id)
from tableb b 
where a.id = b.id and b.date < a.createdate
group by b.id ),0) as total
from tablea a

Для сценария у вас есть строка в таблице a, но нет в таблице b:

  • Функция IFNULL применяется только для mysql.

tablea

ID - Create date
12221 - 12/12/2018
13331 - 12/10/2018
13336 - 12/10/2018

таблица b

ID - Date
12221 - 10/10/2018
12221 - 07/06/2017
13331 - 01/20/2019

результат

ID      MatchCount
12221   2
13331   0
13336   0
0 голосов
/ 16 апреля 2019

Это должно дать вам каждые id от TableA и желаемый счет:

SELECT a.id, COUNT(b.id) AS preSignupEntries
FROM TableA AS a
LEFT JOIN TableB AS b ON a.id = b.id AND a.`Create date` > b.`Date`
GROUP BY a.id;

COUNT, как и большинство агрегатных функций, игнорирует значения NULL.

Изменить: это предполагает, что ваши поля "дата" на самом деле тип данных даты; если вы храните их как строки, вам нужно выполнить их разбор.

Edit2: использование INNER JOIN может быть немного быстрее, если вы на самом деле не заботитесь о записях TableA без предшествующих записей TableB.

0 голосов
/ 16 апреля 2019

Вам нужно выбрать все записи из TableA и количество записей в TableB, у которых есть дата, предшествующая дате в TableA:

CREATE TEMPORARY TABLE TableA (ID INT, CreateDate DATETIME);
INSERT INTO TableA VALUES (12221, '2018-12-12'), (13331, '2018-10-12');

CREATE TEMPORARY TABLE TableB (ID INT, DDate DATETIME);
INSERT INTO TableB VALUES (12221, '2018-10-10'), (12221, '2017-06-07'), (13331, '2019-01-20');

SELECT  a.ID,
        COUNT(b.ID) AS MatchCount
  FROM  TableA a
    LEFT JOIN TableB b ON b.ID = a.ID AND b.DDate < CreateDate
  GROUP BY ID;

DROP TABLE TableA;
DROP TABLE TableB;

Обратите внимание, что в моем примере я переименовал столбец date с TableB на DDate.

Выход:

ID      MatchCount
12221   2
13331   0

В приведенном выше SQL * TableB соединяется с TableA с использованием критериев, согласно которым ID должен быть равен, а дата должна быть до даты создания. Результирующий набор строится путем подсчета количества строк, возвращаемых из TableB, которые соответствуют этому критерию.

0 голосов
/ 16 апреля 2019

попробовать Select id,Count(id) From TableB Group By ID

...