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

Я пытаюсь получить месяцы дней рождения сотрудников, которые встречаются как минимум в 2 рядах

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

SELECT DISTINCT e.EmployeeID, e.City, e.BirthDate
FROM Employees e
GROUP BY e.BirthDate, e.City, e.EmployeeID
HAVING COUNT(MONTH(b.BirthDate))=COUNT(MONTH(e.BirthDate))
UNION
SELECT DISTINCT b.EmployeeID, b.City, b.BirthDate
FROM Employees b
GROUP BY b.EmployeeID, b.BirthDate, b.City
HAVING ...

Приведенная таблица:

| 1 | City1 | 1972-03-26|
| 2 | City2 | 1979-12-13|
| 3 | City3 | 1974-12-16|
| 4 | City3 | 1979-09-11|  

Ожидаемый результат:

| 2 | City2 |1979-12-13|
| 3 | City3 |1974-12-16|

Ответы [ 4 ]

0 голосов
/ 09 мая 2019

Вот еще один подход, использующий GROUP_CONCAT. Это не совсем то, что вы ищете, но это может сделать работу. Подход Эрика лучше, хотя. (Примечание: это для MySQL)

SELECT GROUP_CONCAT(EmployeeID) EmployeeID, BirthDate, COUNT(*) DupeCount 
FROM Employees 
GROUP BY MONTH(BirthDate) 
HAVING DupeCount> 1;
0 голосов
/ 09 мая 2019

Попробуйте и вы сможете обойтись без СОЮЗА:

SELECT 
   EmployeeId
 , City
 , BirthDate 
FROM Employees 
GROUP BY 
   EmployeeId
 , City
 , BirthDate 
HAVING COUNT(Month(BirthDate)) > 2
0 голосов
/ 09 мая 2019

Думайте об этом поэтапно.

Сначала мы найдем месяцы, в которых более одного дня рождения.Это подзапрос ниже, который я называю псевдонимом i для «внутреннего запроса».(Замените MONTH(i.Birthdate) в списке SELECT на 1, если вы хотите увидеть, какие месяцы соответствуют критериям.)

Затем во внешнем запросе (o) вы захотите все поля,так что я обманываю и использую SELECT *.Теоретически, WHERE IN будет работать здесь, но IN может иметь неприятные побочные эффекты, если NULL вернется, поэтому я никогда не буду его использовать.Вместо этого есть коррелированный sub = запрос;то есть мы ищем любые результаты, в которых месяц из внешнего запроса равен месяцам, которые делают сокращение во внутреннем (коррелированном под) запросе.

При использовании коррелированного подзапроса вWHERE предложение, список SELECT не имеет значения.Вы можете поставить 1/0, и он не выдаст ошибку.Но я всегда использую SELECT 1, чтобы показать, что внутренний запрос фактически не возвращает никаких результатов во внешний запрос.Это просто для того, чтобы найти, ну, в общем, корреляцию между двумя наборами данных.

SELECT
  *
FROM
  @table AS o
WHERE 
  EXISTS
    (
      SELECT
        1
      FROM
        @table AS i
      WHERE
        MONTH(i.Birthdate) = MONTH(o.Birthdate)
      GROUP BY 
        MONTH(i.Birthdate)
      HAVING
        COUNT(*) > 1
    );
0 голосов
/ 08 мая 2019

Кажется странным требованием.

Это может помочь с некоторыми изменениями. Работает в Oracle.

    SELECT DATE FROM TABLE WHERE EXTRACT(MONTH FROM DATE)=EXTRACT(MONTH FROM SOMEDATE);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...