【问题标题】:PostgreSQL command : using the result obtained from first Query and using it In second Query : write as single queryPostgreSQL命令:使用从第一个查询获得的结果并在第二个查询中使用它:写为单个查询
【发布时间】:2021-05-27 08:09:51
【问题描述】:
SELECT partner_id 
FROM trip_delivery_sales ts 
WHERE ts.route_id='152' 
GROUP BY ts.partner_id

从查询中我们可以得到合作伙伴 id。使用该合作伙伴 id,我们要检查 trip delicery 销售行表并希望找到每个客户最近两次销售的产品数量总和。如果最后两次销售的产品数量为 2 和 5,则希望结果为 partner_id |算为Mn2333 - 7

例如,我将合作伙伴 ID 设为 34806。但我想检查从上次查询中获得的所有合作伙伴 ID

SELECT product_qty 
FROM trip_delivery_sales_lines td 
WHERE td.partner_id='34806' 
  AND td.route_id='152' 
  AND td.product_id='432' 
ORDER BY td.order_date DESC 
LIMIT 2

【问题讨论】:

  • trip_delivery_salestrip_delivery_sales_lines 之间的关系(外键?)是什么?他们似乎都有partner_idroute_id 列。
  • parter_id 是外键..不想在第二个查询中检查 route_id
  • 你的意思是同一个伙伴在两个表中可能有不同的路由ID?如果您可以发布两个表的示例数据以及所需的结果,将会有所帮助。
  • 合作伙伴只有一个路由 ID。所以不需要在第二次查询中检查路由ID

标签: postgresql


【解决方案1】:

您可以运行此查询

SELECT td.partner_id,sum(product_qty) 
FROM trip_delivery_sales_lines td,
(SELECT partner_id FROM trip_delivery_sales ts WHERE ts.route_id='152') as ts
WHERE td.partner_id=ts.partner_id
AND td.product_id='432' 
GROUP BY td.partner_id
ORDER BY td.order_date DESC 
LIMIT 2

或者这个

with ts as (SELECT distinct partner_id FROM trip_delivery_sales WHERE route_id='152')
SELECT td.partner_id,sum(product_qty)
FROM trip_delivery_sales_lines td,ts
WHERE td.partner_id=ts.partner_id
AND td.product_id='432' 
GROUP BY td.partner_id
ORDER BY td.order_date DESC 
LIMIT 2

【讨论】:

  • 想得到每个合作伙伴的产品数量总和
  • 你在查询中添加 sum 和 group by
【解决方案2】:

您可能正在寻找

SELECT DISTINCT ts.partner_id, ARRAY(
  SELECT product_qty
  FROM trip_delivery_sales_lines td 
  WHERE td.partner_id=ts.partner_id
    AND td.product_id='432' 
  ORDER BY td.order_date DESC 
  LIMIT 2
) AS product_qty_arr
FROM trip_delivery_sales ts 
WHERE ts.route_id='152'

或者只是

SELECT
  partner_id,
  array_agg(product_qty ORDER BY order_date DESC) as product_qty_arr
FROM (
  SELECT
    td.partner_id,
    td.product_qty,
    td.order_date,
    row_number() OVER (PARTITION BY td.partner_id ORDER BY td.order_date DESC)
  FROM trip_delivery_sales_lines td
  JOIN trip_delivery_sales ts USING (partner_id)
  WHERE ts.route_id='152'  
    AND td.product_id='432'
) AS enumerated
WHERE row_number <= 2
GROUP BY partner_id

另请参阅PostgreSQL: top n entries per item in same tableOptimize GROUP BY query to retrieve latest row per user

【讨论】:

  • 在第一个选项中显示错误:错误:列“td.order_date”必须出现在 GROUP BY 子句中或用于聚合函数第 7 行:ORDER BY td.order_date DESC
  • 第二次:错误:缺少表“td”第 10 行的 FROM 子句条目:WHERE td.route_id='152'
  • 你能用你的表定义(最好是样本数据)创建a fiddle吗?如果修正了你提到的两个错误
  • stackoverflow.com/questions/67749631/… ......在这里更新了问题
  • 啊,所以您的 trip_delivery_sales_lines 表没有 route_id 列,正如您的第二个查询所建议的那样?
猜你喜欢
  • 2013-11-01
  • 1970-01-01
  • 2018-03-15
  • 2015-03-16
  • 2018-07-30
  • 1970-01-01
  • 2014-12-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多