如何根据多次出现的月份获取日期?
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;
我正在尝试获取至少在 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;