简体   繁体   English

SQL - 逐年查询

[英]SQL - Query Year by Year

I have a table of employees' info, including their employment start and end date.我有一张员工信息表,包括他们的就业开始和结束日期。 I want to extract a list of employees who have been with the company for the full year, year by year, for the past ten years.我想提取过去十年来在公司工作一整年、年复一年的员工名单。

So for example, if I want to get a list of employees who've been with the company throughout 2010, I'll do a query like this:例如,如果我想获取 2010 年一直在公司工作的员工列表,我将执行如下查询:

SELECT employee_name FROM employees
WHERE employment_start_date < DATE '2010-01-01'
AND employment_end_date > DATE '2010-12-31'

Now, I could repeat this process manually 10 times for each year from 2010 to 2020 (and manually append the relevant year as an additional column), but surely there's an easier way to do this with a single SQL query?现在,我可以从 2010 年到 2020 年每年手动重复此过程 10 次(并手动将相关年份 append 作为附加列),但是使用单个 SQL 查询肯定有更简单的方法吗?

More background info: I'm actually trying to translate my Cypher query directly into an SQL query (because different companies uses different database system).更多背景信息:我实际上是在尝试将我的 Cypher 查询直接转换为 SQL 查询(因为不同的公司使用不同的数据库系统)。 Using Cypher, I'll be doing this:使用 Cypher,我将这样做:

WITH [2010,2011,2012,...,2019,2020] AS years
UNWIND years as y
MATCH (e:employees)
WHERE e.employment_start_date.year < y
AND e.employment_end_date.year > y
RETURN y, e.employee_name

So I'm trying to find an SQL equivalent for this因此,我正在尝试为此找到等效的 SQL


Sample table data:示例表数据:

|employee_name|employment_start_date|employment_end_date|
|:---:|:---:|:---:|
|John|2009-06-01|2015-03-02|
|Mary|2010-04-02|2014-03-07|
|Joseph|2011-03-02|2011-07-03|
|Stephen|2003-06-14|2011-03-07|
|Dew|2010-06-02|2012-02-06|

Desired Results:期望的结果:

|Year|employee_name|
|:---:|:---:|
|2010|John|
|2010|Stephen|
|2011|John|
|2011|Mary|
|2011|Dew|

You can use:您可以使用:

WITH years ( year ) AS (
  SELECT DATE '2010-01-01' FROM DUAL
UNION ALL
  SELECT ADD_MONTHS( year, 12 )
  FROM   years
  WHERE  year < DATE '2020-01-01'
)
SELECT y.year, e.employee_name
FROM   employees e
       INNER JOIN years y
       ON (   e.employment_start_date <= y.year
          AND e.employment_end_date   >=  ADD_MONTHS( y.year, 12 ) )

An alternative to MT0's suggestion: MT0 建议的替代方案:

WITH years (year) AS(
SELECT EXTRACT (YEAR FROM DATE '2010-01-01') + ROWNUM -1 AS "YEAR"
FROM dual
CONNECT BY ROWNUM <=10
)

SELECT y.year, e.employee_name
FROM employee e
INNER JOIN years y
ON (
EXTRACT(YEAR FROM employment_start_date) < y.year
AND EXTRACT(YEAR FROM employment_end_date) > y.year
)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM