postgresql 在单独的列中计算每周每天添加的员工数

qlckcl4x  于 5个月前  发布在  PostgreSQL
关注(0)|答案(3)|浏览(43)

我必须清楚地划分"Employee"表的基础上,一周,然后得到计数的雇员增加了工作日。
示例结果:
| 周|周日|周一|星期二|周三|星期四|周五|周六|总|
| --|--|--|--|--|--|--|--|--|
| 2023年11月26日-2023年2月12日| 27 | 26 | 27 | 25 | 27 | 27 | 28 | 187 |
| 2023年3月12日至9月12日| 27 | 28 | 29 | 26 | 27 | 27 | 27 | 191 |
| 12/10/2023 - 12/16/2023| 27 | 0 | 0 | 0 | 0 | 0 | 0 | 27 |
色谱柱描述:

Week Column : [Start Date of the Week] - [End Date of the Week]
Sunday Column : Count of Employees Added on Sunday.
Monday Column : Count of Employees Added on Monday.
...
Total Column : Total Number of Employee on that Week.

字符串
输入表"Employee"
| “身份证”|“姓名”|“部门”|“JoiningEpoch”|“加入日期”|“CreatedEpoch”|
| --|--|--|--|--|--|
| 1 |罗宾|开发商| 1702706400 |2023-12-16 00:00:00| 1702706400 |
| 2 |EMP2| HR| 1702965600 |2019 -12-09 00:00:00| 1702965600 |
| 3 |EMP3| DevOps| 1701237600 |2019 -11-29 00:00:00| 1701237600 |

sq1bmfud

sq1bmfud1#

要获取每周每个工作日添加的员工数量,可以使用date_trunc()函数按周和工作日对员工进行分组,然后使用count()函数计算每组中的员工数量。类似于:

SELECT
  date_trunc('week', JoiningDate) AS week,
  count(*) FILTER (WHERE EXTRACT(DOW FROM JoiningDate) = 0) AS sunday,
  count(*) FILTER (WHERE EXTRACT(DOW FROM JoiningDate) = 1) AS monday,
  count(*) FILTER (WHERE EXTRACT(DOW FROM JoiningDate) = 2) AS tuesday,
  count(*) FILTER (WHERE EXTRACT(DOW FROM JoiningDate) = 3) AS wednesday,
  count(*) FILTER (WHERE EXTRACT(DOW FROM JoiningDate) = 4) AS thursday,
  count(*) FILTER (WHERE EXTRACT(DOW FROM JoiningDate) = 5) AS friday,
  count(*) FILTER (WHERE EXTRACT(DOW FROM JoiningDate) = 6) AS saturday,
  count(*) AS total
FROM employee
GROUP BY week
ORDER BY week;

字符串
看看它是否有效!

bkkx9g8r

bkkx9g8r2#

您可以使用聚合filter子句在单独的列中获取日计数,通过减去1从ISO 8601星期一开始向后移动一天,以查看从星期日开始的周范围,并使用to_char()或设置DateStyle设置以实现所需的日期格式:Demo at db<>fiddle

set DateStyle='SQL,MDY';

SELECT
  to_char("Week",'MM/DD/YYYY')||' - '||("Week"::date+6)::text AS "Week",
  count(*)filter(where dow=0) AS "Sunday",
  count(*)filter(where dow=1) AS "Monday",
  count(*)filter(where dow=2) AS "Tuesday",
  count(*)filter(where dow=3) AS "Wednesday",
  count(*)filter(where dow=4) AS "Thursday",
  count(*)filter(where dow=5) AS "Friday",
  count(*)filter(where dow=6) AS "Saturday",
  count(*) AS "Total"
FROM (SELECT date_trunc('week', "JoiningDate")::date-1 AS "Week", 
             extract(DOW FROM "JoiningDate") dow 
      FROM "Employee")AS a
GROUP BY 1 ORDER BY "Week";

字符串
| 周|周日|周一|周二|周三|周四|周五|周六|总|
| --|--|--|--|--|--|--|--|--|
| 2023年11月26日-2023年2月12日| 0 | 0 | 0 | 1 | 0 | 0 | 0 | 1 |
| 2023年3月12日至9月12日| 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 |
| 12/10/2023 - 12/16/2023| 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 |
tablefunc扩展中还有一个crosstab()函数可以自动以这种方式透视结果。

cnh2zyt3

cnh2zyt33#

因为我只能使用Postgres 9.5版本,
我们可以在Date上使用DOW得到“DayOfWeek”列,这个dow将有一周中的一天,如Sunday(0)到Saturday(6)。
现在要获得一周的开始和结束日期,我们可以使用INTERVAL类型的[Start of the Week Date]减去“JoiningDate”和“DayOfWeek”列,并将6 -“DayOfWeek”interval添加到“JoiningDate”中,用于[End of the Week Date]也可以使用TO_CHARYYYY-MM-DD用于“Week”列。
稍后,为了对查询求和,我们可以在周列中使用Group BY,在“DayOfWeek”列中使用SumCase语句来获得每天的员工总数。

SELECT 
    SUM(CASE WHEN ("DayOfWeek" =  0)   THEN "EmployeeCount" ELSE '0' END )  AS "Sun",
    SUM(CASE WHEN ("DayOfWeek" =  1)   THEN "EmployeeCount" ELSE '0' END )  AS "Mon",
    SUM(CASE WHEN ("DayOfWeek" =  2)   THEN "EmployeeCount" ELSE '0' END )  AS "Tue",
    SUM(CASE WHEN ("DayOfWeek" =  3)   THEN "EmployeeCount" ELSE '0' END )  AS "Wed",
    SUM(CASE WHEN ("DayOfWeek" =  4)   THEN "EmployeeCount" ELSE '0' END )  AS "Thr",
    SUM(CASE WHEN ("DayOfWeek" =  5)   THEN "EmployeeCount" ELSE '0' END )  AS "Fri",
    SUM(CASE WHEN ("DayOfWeek" =  6)   THEN "EmployeeCount" ELSE '0' END )  AS "Sat",
    SUM("EmployeeCount")                                                    AS "Total",
    "Week",
FROM (
    SELECT

        -- Week is Sunday to Saturday instead of Monday to Sunday
        -- "2021-07-18 - 2021-07-24" Week
        TO_CHAR("JoiningDate" - (("DayOfWeek") || ' days')::INTERVAL ,'YYYY-MM-DD')
        || ' - ' ||
        TO_CHAR("JoiningDate" + ((6 - "DayOfWeek") || ' days')::INTERVAL ,'YYYY-MM-DD') AS "Week",

        "DayOfWeek",
        COUNT("Id")  AS "EmployeeCount"
    FROM (
        SELECT
            "Id",  TO_TIMESTAMP("JoiningEpoch") AT TIME ZONE 'America/Chicago' ) AS "JoiningDate",

            -- The day of the week as Sunday (0) to Saturday (6), Using INTEGER instead of dayname to increase Perfomance
            EXTRACT(DOW FROM DATE( TO_TIMESTAMP("JoiningEpoch") AT TIME ZONE 'America/Chicago' ))   AS "DayOfWeek",   -- 0-6  DayNumber
        FROM "Employee"
    ) AS sq
    GROUP BY 1,2
) AS sq1
GROUP BY "Week"
ORDER BY "Week"

字符串

相关问题