Подсчет различных дат из двух столбцов в одной таблице sql

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

В настоящее время у меня есть таблица (CT_JOINED), которая включает три столбца: столбец идентификатора (TUMOURID), столбец даты (AVCT_DATE) и еще один столбец даты (OPDATE).

Например, столбцы для двух идентификаторов выглядят следующим образом:

ID, AVCT_DATE, OPDATE
1, 06-APR-13, 06-APR-13
1, 06-APR-13, 14-JUN-13
1, 06-APR-13, 22-JUN-13
2, 03-APR-14, 10-DEC-15
2, 03-APR-14, 31-DEC-15

Я пытаюсь создать столбец, равный количеству уникальных дат для каждого идентификатора. Таким образом, результат для ID 1 будет 3, а результат для ID 2 будет 3.

Я попытался подсчитать количество различных значений в двух столбцах, но это не дает приведенных выше ответов (вместо этого он сообщает значения 3 и 2 соответственно):

select TUMOURID, COUNT(DISTINCT(AVCT_DATE || OPDATE)) AS COUNT 
FROM CT_JOINED
GROUP BY TUMOURID;

То же самое произойдет, если я попробую сделать то же самое в новой таблице:

CREATE TABLE CT_DISTINCT AS (
SELECT TUMOURID, COUNT(*) AS COUNT
FROM (
SELECT DISTINCT TUMOURID, AVCT_DATE, OPDATE
FROM CT_JOINED)
GROUP BY TUMOURID
);

Я в недоумении. Является ли это возможным?

1
0
519
4

Ответы 4

Отверните данные, а затем используйте count(distinct) или удалите дубликаты по пути:

select tumourid, count(*)
from ((select tumourid, avct_date as dte
       from ct_joined
      ) union -- intentional to remove duplicates
      (select tumourid, opdate as dte
       from ct_joined
      )
     ) t
group by tumourid;

Вы можете использовать:

SELECT TUMOURID, COUNT(DISTINCT d) AS cnt
FROM (select TUMOURID, AVCT_DATE AS d
      FROM CT_JOINED
      UNION ALL
      SELECT TUMOURID, OPDATE AS d) sub
GROUP BY TUMOURID;

Используйте UNION, чтобы избежать дублирования даты, и просто используйте count(*):

SELECT tumourid, COUNT(date)
FROM ((SELECT tumourid, avct_date AS date
       FROM ct_joined
      ) UNION
      (SELECT tumourid, opdate 
       FROM ct_joined
      )
     ) t
GROUP BY tumourid;

Все ответы ниже работают как шарм с несколькими настройками, чтобы также учитывать строки с нулевыми значениями. Например:

SELECT TUMOURID, COUNT(*)
FROM ((SELECT TUMOURID, AVCT_DATE AS DTE
       FROM CT_JOINED
       WHERE AVCT_DATE IS NOT NULL
      ) UNION
      (SELECT TUMOURID, OPDATE AS DTE
       FROM CT_JOINED
       WHERE OPDATE IS NOT NULL
      )
     ) T
GROUP BY TUMOURID;

Большое спасибо.

Если вы используете count(date), вам не нужно использовать is not null.

Yogesh Sharma 10.08.2018 17:36

Другие вопросы по теме