Python 获取按名称分组的项目的最低价格
我有一个来自不同商店的不同产品的报价列表,我喜欢设置一个show=1,其中产品在所有商店的价格最低 我的数据库结构是这样的Python 获取按名称分组的项目的最低价格,python,postgresql,Python,Postgresql,我有一个来自不同商店的不同产品的报价列表,我喜欢设置一个show=1,其中产品在所有商店的价格最低 我的数据库结构是这样的 "ID" integer NOT NULL DEFAULT nextval('"db_name_ID_seq"'::regclass) ( INCREMENT 1 START 1 MINVALUE 1 MAXVALUE 2147483647 CACHE 1 ), link text COLLATE pg_catalog."default" N
"ID" integer NOT NULL DEFAULT nextval('"db_name_ID_seq"'::regclass) ( INCREMENT 1 START 1 MINVALUE 1 MAXVALUE 2147483647 CACHE 1 ),
link text COLLATE pg_catalog."default" NOT NULL,
link_short text COLLATE pg_catalog."default",
query text COLLATE pg_catalog."default",
warehouse text COLLATE pg_catalog."default",
categoria text COLLATE pg_catalog."default",
name text COLLATE pg_catalog."default",
current_price double precision,
min_price double precision,
coupon text COLLATE pg_catalog."default",
coupon2 text COLLATE pg_catalog."default",
from_bot text COLLATE pg_catalog."default",
flag text COLLATE pg_catalog."default",
flag_link text COLLATE pg_catalog."default",
show smallint,
link_original text COLLATE pg_catalog."default",
CONSTRAINT db_name_pkey PRIMARY KEY (link)
我尝试了一些不同的解决方案,但每个名称只能有一个产品被标记为show=1
cur = conn.cursor()
#cur.execute("Select LINK, MIN(CURRENT_PRICE), WAREHOUSE from db_name GROUP BY LINK,NAME,WAREHOUSE".format(db_name_scrap_temp))
cur.execute("SELECT mt.link,mt.current_price,mt.warehouse FROM db_name mt INNER JOIN(SELECT name, MIN(current_price) minprice FROM db_name GROUP BY name) t ON mt.name = t.name AND mt.CURRENT_PRICE = t.minprice".format(db_name_scrap_temp,db_name_scrap_temp))
rows = cur.fetchall()
for row in rows:
db_link = row[0]
db_current_price = row[1]
db_warehouse = row[2]
cur.execute("LOCK TABLE db_name;"
"UPDATE db_name SET SHOW = 1 WHERE LINK = '{}' AND CURRENT_PRICE = {}".format(db_name_scrap_temp,db_name_scrap_temp,db_link,db_current_price))
conn.commit()
我需要的是列出unic项目,以最低价格重新命名链接商店。您可以使用DISTINCT ON获得每个产品的最低价格。请注意,DISTINCT ON子句需要ORDER BY子句。另外,你应该考虑一下如果价格有平局该怎么办。如前所述,此查询将返回其中一个选项,但您无法真正预测哪个选项。添加到order by子句以改进逻辑:
SELECT DISTINCT ON (name)
link,
current_price,
warehouse
FROM db_name
ORDER BY name, current_price ASC;
您也不需要循环:
WITH lowest_price_ids AS (
SELECT DISTINCT ON (name)
id,
link,
current_price,
warehouse
FROM db_name
ORDER BY name, current_price ASC)
, update_show AS (
UPDATE db_name set show = 1 WHERE EXISTS (
select FROM db_name where db_name.id = lowest_price_ids.id
)
)
UPDATE db_name set show = 0 WHERE NOT EXISTS (
select FROM db_name where db_name.id = lowest_price_ids.id
);
谢谢,我想这会管用的,你第二个quary错过了一个我正在寻找的地方。。。当我得到一个错误时——错误:第17行:cerca de«»的sintaxis de o cerca de;
select *,
(case row_number() over(partition by name order by price)
when 1 then 1 else 0 end) as show
from products