SELECT * FROM
(SELECT user_id, SUM(update_qty)
FROM inv_tran
WHERE code = 'Pick'
AND to_loc_id = 'CONTAINER'
AND work_group LIKE 'B%'
AND dstamp BETWEEN to_date('30/07/2021 18:00:00', 'dd/mm/yyyy hh24:mi:ss') AND
to_date('31/07/2021 06:00:00', 'dd/mm/yyyy hh24:mi:ss')
GROUP BY user_id
ORDER BY 2 DESC
FETCH FIRST 5 ROWS ONLY)
嗨,我遇到了一个问题,我不知道如何解决它。我有这个查询,我正在尝试显示第二个,它会完全相同,但 work_group LIKE 'S%'
基本上我想显示工作组中的前 5 个用户(如 B%)和工作组中的前 5 个用户(如 S%)。我试图使用交叉连接,但它给了我 50 条记录,而不是 5 条,这对我来说是可以理解的。
我需要这个输出,但据我所知,这是不可能的。
USERID UPDATE_QTY USERID UPDATE_QTY
1 USER1 898 USER6 252
2 USER2 516 USER7 242
3 USER3 415 USER8 132
4 USER4 325 USER9 25
5 USER5 216 USER10 4
使用表格提供模式,然后使用窗口函数中的模式对每个模式的行进行编号。然后连接来自每个模式结果的行以配对 n = 1 个案例、n = 2 个案例等。
在以下示例中,第二个 CTE 术语仅用于提供测试数据(您的 inv_tran 表)。当实际表存在时,只需删除该 CTE 术语。如果您真的不想将每个模式组的 5 个结果配对,只需删除最后一个连接即可。
WITH patterns (pattern) AS (
SELECT 'B%' FROM dual UNION
SELECT 'S%' FROM dual
)
, inv_tran (user_id, update_qty, code, to_loc_id, work_group, dstamp) AS (
SELECT 1, 121, 'Pick', 'CONTAINER', 'Battery', sysdate FROM dual UNION
SELECT 2, 122, 'Pick', 'CONTAINER', 'Battery', sysdate FROM dual UNION
SELECT 3, 123, 'Pick', 'CONTAINER', 'Battery', sysdate FROM dual UNION
SELECT 4, 124, 'Pick', 'CONTAINER', 'Battery', sysdate FROM dual UNION
SELECT 5, 125, 'Pick', 'CONTAINER', 'Battery', sysdate FROM dual UNION
SELECT 6, 126, 'Pick', 'CONTAINER', 'Battery', sysdate FROM dual UNION
SELECT 11, 121, 'Pick', 'CONTAINER', 'Storage', sysdate FROM dual UNION
SELECT 12, 122, 'Pick', 'CONTAINER', 'Storage', sysdate FROM dual UNION
SELECT 13, 123, 'Pick', 'CONTAINER', 'Storage', sysdate FROM dual UNION
SELECT 14, 124, 'Pick', 'CONTAINER', 'Storage', sysdate FROM dual UNION
SELECT 15, 125, 'Pick', 'CONTAINER', 'Storage', sysdate FROM dual UNION
SELECT 16, 126, 'Pick', 'CONTAINER', 'Storage', sysdate FROM dual
)
, grps AS (
SELECT *
FROM (
SELECT user_id, SUM(update_qty)
, ROW_NUMBER() OVER (PARTITION BY pattern ORDER BY SUM(update_qty) DESC) AS n
, pattern
FROM inv_tran, patterns
WHERE code = 'Pick'
AND to_loc_id = 'CONTAINER'
AND work_group LIKE pattern
AND dstamp BETWEEN to_date('30/07/2021 18:00:00', 'dd/mm/yyyy hh24:mi:ss')
AND to_date('31/07/2021 06:00:00', 'dd/mm/yyyy hh24:mi:ss')
GROUP BY user_id, pattern
)
WHERE n <= 5
)
SELECT g1.*
, g2.*
FROM grps g1
JOIN grps g2
ON g1.n = g2.n
AND g1.pattern < g2.pattern
ORDER BY g1.n
;
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句