首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为唯一列的每5行选择前10行

为唯一列的每5行选择前10行
EN

Stack Overflow用户
提问于 2021-03-10 10:17:23
回答 3查看 46关注 0票数 2

在Postgres中,给定以下简化的orders数据集

代码语言:javascript
运行
复制
ID    STORE_ID    UPDATED_AT
1     "store-1"   2021-01-01
2     "store-2"   2021-01-02
3     "store-3"   2021-01-03
4     "store-1"   2021-01-04
5     "store-2"   2021-01-05
6     "store-3"   2021-01-06
...
1000  "store-1"    2021-02-05

如何编写一个查询来选择前5唯一存储id的,以及按最老到最新的顺序订购的每个存储的前10次订单,结果最多返回50行?例如:

代码语言:javascript
运行
复制
ID    STORE_ID    UPDATED_AT
1     "store-1"   2021-01-01
4     "store-1"   2021-01-04
...
13    "store-1"   2021-01-12

2     "store-2"   2021-01-02
5     "store-2"   2021-01-05
...
18    "store-2"   2021-01-08

3     "store-3"   2021-01-03
8     "store-3"   2021-01-12
...
22    "store-3"   2021-01-22

我的目标是处理订单从最老到最新,但处理最古老的10个订单每家商店,因为我可以批量使用Shopify API,这将是更有效的。

例如,在我的代码中,我将将它组合成如下所示:

代码语言:javascript
运行
复制
{
  "store-1": [{ /* order */ }, { /* order */ }, { /* order */ }, ...], // Array of 10 orders
  "store-2": [{ /* order */ }, { /* order */ }, { /* order */ }, ...], // Array of 10 orders
  "store-3": [{ /* order */ }, { /* order */ }, { /* order */ }, ...], // Array of 10 orders
  "store-4": [{ /* order */ }, { /* order */ }, { /* order */ }, ...], // Array of 10 orders
  "store-5": [{ /* order */ }, { /* order */ }, { /* order */ }, ...], // Array of 10 orders
}

因此,我可以对每个商店并行运行5个API调用。

我尝试了多个查询,包括以下内容:

代码语言:javascript
运行
复制
SELECT a.store_id FROM orders a
    INNER JOIN
        (SELECT store_id FROM orders GROUP BY store_id ORDER BY MIN(updated_at) LIMIT 5) b
    ON a.store_id = b.store_id
    ORDER BY a.updated_at ASC;

但我不能将每个存储ID的行限制为10行。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2021-03-10 10:53:29

demo:db<>fiddle

代码语言:javascript
运行
复制
SELECT
    o.*
FROM (
    SELECT
        store_id
    FROM (
        SELECT DISTINCT ON (store_id)    -- 1a
            store_id, updated_at
        FROM orders
        ORDER BY store_id, updated_at
    ) s
    ORDER BY updated_at                  -- 1b
    LIMIT 5
) s
CROSS JOIN LATERAL (                     -- 2
    SELECT 
        *
    FROM orders o
    WHERE o.store_id = s.store_id
    ORDER BY updated_at
    LIMIT 10
) o

1( a)使用DISTINCT ON b只返回每个商店一条记录),确定按日期排序的前5家商店。2.这些存储可以在横向连接中用于筛选每个商店的订单,也可以使用updated_at订单。

票数 1
EN

Stack Overflow用户

发布于 2021-03-10 10:28:38

代码语言:javascript
运行
复制
with st as
(
 select distinct store_id 
 from orders 
 order by <your business rule here> 
 limit 5
)
select st.store_id, l.updated_at 
from st 
cross join lateral
(
 select updated_at
 from orders o
 where o.store_id = st.store_id
 order by updated_at desc
 limit 10
) l;
票数 1
EN

Stack Overflow用户

发布于 2021-03-10 11:11:55

还有一个可能的查询:

代码语言:javascript
运行
复制
select ID,    STORE_ID,    UPDATED_AT
from (
  select 
      orders.* ,
      row_number() over (partition by STORE_ID order by UPDATED_AT desc) rn_order,
      dense_rank() over(order by STORE_ID) store_rank
  from orders
  order by STORE_ID
) ranked 
where store_rank <= [count srores] and rn_order <= [count orders per store];

PostgreSQL小提琴

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66562668

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档