gpt4 book ai didi

sql - 获取每 3 天组取 1 次的发生次数

转载 作者:行者123 更新时间:2023-12-01 06:29:20 25 4
gpt4 key购买 nike

我为通常上类迟到的员工准备了一张 table 。我需要向人力资源部门发送一份报告,显示每个迟到的用户,考虑到如果该用户在 3 天内迟到至少 1 次,我只能计算每个用户的警告。

我需要的第一个数据是要发送给 HR 经理以评估全局“迟到”的警告总数。

仅迟到一天的用户将收到一个警告,但如果他们迟到两次或更多,则他们收到的警告取决于他们是否在从第一天算起的 3 天内收到警告。

让我们看一个例子:

  • 乔星期一 9 日
  • 标记星期一 9 日
  • 蒂姆星期一 9 日
  • 乔星期二 10 日
  • 乔星期三 11 日
  • 乔 星期四 12 日
  • 蒂姆星期五 13 日

  • 以上表中的数据为例。

    Joe 将收到 2 次警告:第一次是周一,第二次是周四。星期二和星期三将被丢弃,因为它们属于相同的 3 天时间段。

    马克周一只会收到一个警告。

    蒂姆将收到 2 次警告。周一第一次,周五第二次。

    也许这个数字是不可能使用标准的 sql 查询获得的,需要做一些游标。

    提前致谢

    最佳答案

    好的...这里缺少一些信息,正如在两条评论(Quassnoi 和 Mr. Llama)中正确说明的那样。

    使用中的 RDBMS 会影响解决方案,因为这与日期函数和日期代数有关,并非所有 RDBMS 都共享相同的扩展函数集。 我假设了 MySQL 5.5,它很常见,可以在 SQLFiddle 上进行测试。

    您的 3 天期限也有点模糊。是对所有员工都一样,还是取决于什么?是 3 天,还是半周(周一至周三、周四至周六)?之后会发生什么?我们使用星期二,然后是星期三,等等吗? 我假设所有员工的半周(星期日,星期四,星期六)都是一样的。`所以一个时期是由年,一年中的一周,半周确定的。

    您应该清除的最后一点是预期结果集。您想要警告天数或计数或什么的列表? 我已经假设了一个警告列表,每个警告的日期(我已经为每个员工和期间的组合取了第一个日期)。

    使用以下语句创建示例数据集:

    CREATE TABLE LateEntrances (
    Employee VARCHAR(20),
    DateLate DATE
    );
    INSERT INTO LateEntrances VALUES('Joe' ,'2014.06.09');
    INSERT INTO LateEntrances VALUES('Mark','2014.06.09');
    INSERT INTO LateEntrances VALUES('Tim' ,'2014.06.09');
    INSERT INTO LateEntrances VALUES('Joe' ,'2014.06.10');
    INSERT INTO LateEntrances VALUES('Joe' ,'2014.06.11');
    INSERT INTO LateEntrances VALUES('Joe' ,'2014.06.12');
    INSERT INTO LateEntrances VALUES('Tim' ,'2014.06.13');

    以下查询解决了您的问题:
    SELECT i.Employee, i.YearLate, i.WeekLate, i.PeriodLate, MIN(i.DateLate)
    FROM (
    SELECT Employee, DateLate,
    YEAR(DateLate) AS YearLate,
    WEEKOFYEAR(DateLate) AS WeekLate,
    FLOOR(DAYOFWEEK(DateLate)/4) AS PeriodLate
    FROM LateEntrances
    ) i
    GROUP BY i.Employee, i.YearLate, i.WeekLate, i.PeriodLate;

    (SQLFiddle here)

    YearLate、WeekLate 和 PeriodLate 三列标识警告期。您可以将它们连接在单个期间标识列中:
    SELECT i.Employee, i.PeriodLate, MIN(i.DateLate)
    FROM (
    SELECT Employee, DateLate,
    CONCAT_WS('*',
    YEAR(DateLate) ,
    WEEKOFYEAR(DateLate) ,
    FLOOR(DAYOFWEEK(DateLate)/4)
    ) AS PeriodLate
    FROM LateEntrances
    ) i
    GROUP BY i.Employee, i.PeriodLate;

    ...或者您可以将它们全部隐藏(在 SELECT 中),即使您仍然必须使用它们来 GROUP BY:
    SELECT i.Employee, MIN(i.DateLate)
    FROM (
    SELECT Employee, DateLate,
    CONCAT_WS('*',
    YEAR(DateLate) ,
    WEEKOFYEAR(DateLate) ,
    FLOOR(DAYOFWEEK(DateLate)/4)
    ) AS PeriodLate
    FROM LateEntrances
    ) i
    GROUP BY i.Employee, i.PeriodLate;

    您还可以轻松地将期间计算逻辑更改为其他内容,例如严格的一年 3 天或一个月的 3 天。有很多可能性。

    ...根据我所做的假设。清除开放点,我会尽力使答案更好。但与此同时,这应该足以让您开始。

    关于sql - 获取每 3 天组取 1 次的发生次数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24335999/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com