0

我正在使用 AWS Personalize,其中一项服务配额是“至少 1000 条记录,其中至少包含 25 个唯一用户,每个用户至少有 2 条记录”,我知道我的原始数据有这些数字,但我正在尝试找到一种方法来保证这些数字将始终得到满足,即使查询是由其他人在未来运行的。

最简单的方法是使用完整的数据集,但现在我们正在努力实现 POC,所以这并不是我的第一选择。我只计算出现次数就涵盖了“每个记录两个”部分,但我不知道如何保证最少 25 个用户。

重要的是要说我的数据在保存时不会以任何方式打乱。

我的查询

SELECT C.productid AS ITEM_ID,
    A.userid AS USER_ID,
    A.createdon AS "TIMESTAMP",
    B.fromaddress_countryname AS "LOCATION"
FROM A AS orders
    JOIN B AS sub_orders ON orders.order_id = sub_orders.order_id
    JOIN C AS order_items ON orders.order_id = order_items.order_id
WHERE orders.userid IN (
        SELECT orders.userid
        FROM A AS ORDERS
        GROUP BY orders.userid
        HAVING count(*) > 2
    )
LIMIT 10

因为我在 AWS Athena 中,所以我使用 LIMIT 来查询一个子集。

4

1 回答 1

0

IN查询效率不高,因为它需要将每一行与子查询的所有(最坏情况)元素进行比较以找到匹配项。

首先将所有具有至少 2 条记录的用户存储在公用表表达式 (CTE) 中并执行连接以选择它们会更容易。

为确保至少有 25 个不同的用户,您将需要一个窗口函数来计算自第一行以来的唯一用户并在该计数上添加条件。由于您不能在where子句中使用窗口函数,您将需要第二个 CTE 和一个查询它的最终查询。

例如:

with users as (
    select userid as good_users 
    from orders 
    group by 1 
    having count(*) > 1 -- this condition ensures at least 2 records
),
cte as (
    SELECT C.productid AS ITEM_ID,
    A.userid AS USER_ID,
    A.createdon AS "TIMESTAMP",
    B.fromaddress_countryname AS "LOCATION",
    count(distinct A.userid) over (rows between unbounded preceding and current row) as n_distinct_users
FROM A AS orders
    JOIN B AS sub_orders ON orders.order_id = sub_orders.order_id
    JOIN C AS order_items ON orders.order_id = order_items.order_id
    JOIN users on A.userid = users.userid --> ensure only users with 2 records
order by A.userid -- needed for the window function 
)
select * from cte where n_distinct_users < 26

排序useridcte确保每个用户 ID 至少有 2 条记录出现在结果中。

于 2021-11-30T08:16:00.317 回答