Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 获取按名称分组的项目的最低价格_Python_Postgresql - Fatal编程技术网

Python 获取按名称分组的项目的最低价格

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

我有一个来自不同商店的不同产品的报价列表,我喜欢设置一个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" 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