Sql 使用有序值更新表

Sql 使用有序值更新表,sql,postgresql,postgresql-9.2,Sql,Postgresql,Postgresql 9.2,我需要更新一个按价格排序的表,并重新分配排序的价格。 价格和价值按类别分组。以下是一个例子: | ID | idcategory | price | value | | 1 | 1 | 10 | 3 | | 2 | 1 | 12 | 30 | | 3 | 1 | 43 | 9 | | 4 | 1 | 32 | 2

我需要更新一个按价格排序的表,并重新分配排序的价格。 价格和价值按类别分组。以下是一个例子:

| ID | idcategory | price | value | | 1 | 1 | 10 | 3 | | 2 | 1 | 12 | 30 | | 3 | 1 | 43 | 9 | | 4 | 1 | 32 | 23 | | 5 | 2 | 38 | 13 | | 6 | 2 | 8 | 26 | | 7 | 2 | 3 | 34 | | 8 | 2 | 10 | 12 | . .. .. .. .. .. .. ... ... .. .. .. .. 我需要通过idcategory对表分组重新排序,将订购值重新分配给订购价格,如下所示:

| ID | idcategory | price | value | | 1 | 1 | 10 | 3 | | 2 | 1 | 12 | 9 | | 3 | 1 | 32 | 23 | | 4 | 1 | 43 | 30 | | 5 | 2 | 3 | 12 | | 6 | 2 | 8 | 13 | | 7 | 2 | 10 | 26 | | 8 | 2 | 38 | 34 | .. .. .. .. .. .. .. .. .. ... .. 数据库是Postgres9.2

任何想法都将不胜感激

谢谢你,新年快乐

这是基于GarethD建议的更新工作解决方案:

WITH OrderedValues AS ( SELECT Value, Price, idcategory, ROW_NUMBER() OVER(PARTITION BY idcategory ORDER BY Value) AS ValueNum, ROW_NUMBER() OVER(PARTITION BY idcategory ORDER BY Price) AS PriceNum FROM T ), OrderedIDs AS ( SELECT ID, idcategory, ROW_NUMBER() OVER(PARTITION BY idcategory ORDER BY ID) AS RowNum FROM T ), NewValues AS ( SELECT i.ID, v.Value, p.Price FROM OrderedIDs i INNER JOIN OrderedValues v ON i.RowNum = v.ValueNum AND i.idcategory = v.idcategory INNER JOIN OrderedValues p ON i.RowNum = p.PriceNum AND i.idcategory = p.idcategory ) UPDATE T SET Price = v.Price, Value = v.Value FROM NewValues v WHERE v.ID = T.ID; SELECT * FROM T;
您首先需要对IDs ORDEREDD和价格/价值组合OrderedValues进行排序。然后可以匹配相应的列组和新值,并相应地更新表:

WITH OrderedValues AS
(   SELECT  Value, 
            Price,
            idcategory,
            ROW_NUMBER() OVER(PARTITION BY idcategory ORDER BY Value, Price) AS RowNum
    FROM    T
), OrderedIDs AS
(   SELECT  ID,
idcategory,
            ROW_NUMBER() OVER(PARTITION BY idcategory ORDER BY ID) AS RowNum
    FROM    T
), NewValues AS
(   SELECT  i.ID,
            v.Value,
            v.Price
    FROM    OrderedIDs i
            INNER JOIN OrderedValues v
                ON i.RowNum = v.RowNum
                AND i.idcategory = v.idcategory
)
UPDATE  T
SET     Price = v.Price,
        Value = v.Value
FROM    NewValues v
WHERE   v.ID = T.ID;

如何确定此数据的顺序?ASCI的价格和价值都必须调整查询,因为它不考虑按idcategory分组。价格和价值必须按id\U类别分组。谢谢,但价格不是订单,只是价值。我将尝试修改查询。再次感谢您在OrderedValues CTE中通过部分ROW_NUMBER函数更改ORDER BY中的列。只要分区保持不变,您就可以随意排序。