SQL 查询 return 多个员工的 2 个结果

SQL Query to return 2 results for multiple employees

我对 SQL 很陌生,事实上,我完全是自学的。我目前在下面有这个查询,它可以(很糟糕地)找到员工的 2 张随机支持票。

现在,查询将询问员工姓名并提供 2 个结果。有没有办法让它为所有员工提供 2 个结果?

SELECT
        TOP 2 CONVERT (
            DATE,
            SD_REQUEST.END_DATE_UT
        ) AS 'Close Date',
        SD_REQUEST.RFC_number AS 'Ticket',
        agent.LAST_NAME AS 'Agent',
        AM_DOMAIN.NAME_EN AS 'Company',
        EE.LAST_NAME AS 'Recipient',
        RR.LAST_NAME AS 'Requestor',
        catpath.SD_CATALOG_PATH_EN
    FROM
        SD_REQUEST
    LEFT JOIN AM_EMPLOYEE AS agent ON agent.EMPLOYEE_ID = SD_REQUEST.OWNER_ID
    LEFT JOIN AM_EMPLOYEE AS EE ON EE.EMPLOYEE_ID = SD_REQUEST.RECIPIENT_ID
    LEFT JOIN AM_EMPLOYEE AS RR ON RR.EMPLOYEE_ID = SD_REQUEST.REQUESTOR_ID
    LEFT JOIN SD_CATALOG_PATH AS catpath ON catpath.SD_CATALOG_ID = SD_REQUEST.SD_CATALOG_ID
    LEFT JOIN AM_DOMAIN ON AM_DOMAIN.DOMAIN_ID = EE.DEFAULT_DOMAIN_ID
    WHERE
        agent.LAST_NAME = 'insert name here'
    AND CONVERT (
        datetime,
        SD_REQUEST.END_DATE_UT,
        101
    ) BETWEEN (Getdate() - 8)
    AND (Getdate() - 2)
    ORDER BY
        NEWID()

我假设您正在使用 SQL 基于所讨论语法的服务器。您可以在 cte/subquery 中使用 ROW_NUMBER() 函数为每一行生成一个数字,使用 PARTITION BY 您可以为给定 set/group 的每个成员重新开始编号,在这种情况下 agent.LAST_NAME,您可以使用该数字将每个 set/group:

限制为两个结果
;with cte AS (
        SELECT  CONVERT (DATE,SD_REQUEST.END_DATE_UT) AS 'Close Date',
                SD_REQUEST.RFC_number AS 'Ticket',
                agent.LAST_NAME AS 'Agent',
                AM_DOMAIN.NAME_EN AS 'Company',
                EE.LAST_NAME AS 'Recipient',
                RR.LAST_NAME AS 'Requestor',
                catpath.SD_CATALOG_PATH_EN,
                ROW_NUMBER() OVER(PARTITION BY agent.LAST_NAME ORDER BY NEWID()) AS RN
            FROM
                SD_REQUEST
            LEFT JOIN AM_EMPLOYEE AS agent ON agent.EMPLOYEE_ID = SD_REQUEST.OWNER_ID
            LEFT JOIN AM_EMPLOYEE AS EE ON EE.EMPLOYEE_ID = SD_REQUEST.RECIPIENT_ID
            LEFT JOIN AM_EMPLOYEE AS RR ON RR.EMPLOYEE_ID = SD_REQUEST.REQUESTOR_ID
            LEFT JOIN SD_CATALOG_PATH AS catpath ON catpath.SD_CATALOG_ID = SD_REQUEST.SD_CATALOG_ID
            LEFT JOIN AM_DOMAIN ON AM_DOMAIN.DOMAIN_ID = EE.DEFAULT_DOMAIN_ID
        WHERE  CONVERT (datetime,SD_REQUEST.END_DATE_UT,101) BETWEEN (Getdate() - 8) AND (Getdate() - 2)
        )
SELECT *
FROM cte
WHERE RN <= 2