如何根据多次出现的月份获取日期?

How to get dates based on months that appear more than once?

我正在尝试获取至少在 2 行中找到的员工生日月份

我尝试将生日信息 table 与其自身结合起来,假设我可以遍历它们并获得多次出现的月份 有一个问题:如何获得重复月份不止一次的生日?

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 ...

给定 table:

| 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|

似乎是一个奇怪的要求。

这可能有助于进行一些调整。在 Oracle 中工作。

    SELECT DATE FROM TABLE WHERE EXTRACT(MONTH FROM DATE)=EXTRACT(MONTH FROM SOMEDATE);

试一试,您也许可以免除 UNION:

SELECT 
   EmployeeId
 , City
 , BirthDate 
FROM Employees 
GROUP BY 
   EmployeeId
 , City
 , BirthDate 
HAVING COUNT(Month(BirthDate)) > 2

分步骤思考。

首先,我们要找出生日超过一个的月份。这就是下面的 sub-query,我将其别名为 i for "inner query"。 (如果您想查看哪些月份符合条件,请将 MONTH(i.Birthdate) 替换为 SELECT 列表中的 1。)

然后,在外部查询 (o) 中,您需要所有字段,所以我在作弊并使用 SELECT *。理论上,WHERE IN 可以在这里工作,但是如果 NULL 返回,IN 可能会产生不幸的副作用,所以我从不使用它。相反,有一个相关的 sub=query;也就是说,我们寻找任何结果,其中来自外部查询的月份等于在内部(相关子)查询中进行切割的月份。

WHERE 子句中使用相关 sub-query 时,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
    );

这是使用 GROUP_CONCAT 的另一种方法。这不完全是您要找的东西,但它可能会完成这项工作。不过 Eric 的方法更好。 (注:这是给MySQL的)

SELECT GROUP_CONCAT(EmployeeID) EmployeeID, BirthDate, COUNT(*) DupeCount 
FROM Employees 
GROUP BY MONTH(BirthDate) 
HAVING DupeCount> 1;