sql - 使用有序值更新表

标签 sql postgresql postgresql-9.2

我需要更新按价格排序的表格并重新分配订购价格。 价格和值(value)按 idcategory 分组。这是一个例子:

|  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    |
.. .. .. .. .. .. .. .. .. ... .. 

数据库是 postgres 9.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;

最佳答案

您首先需要对您的 ID (OrderedIDs) 和价格/值(value)组合 (OrderedValues) 进行排名。然后你可以匹配相应的等级(NewValues),并相应地更新你的表:

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;

Example on SQL Fiddle

关于sql - 使用有序值更新表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20861507/

相关文章:

mysql - 商店缩写还是完整标签?

SQL != ALL() 难度

python - 找不到页面 (404) 请求方法 : POST Request URL: http://127. 0.0.1:8000/accounts/signup/signup

异常中的字符串连接

postgresql - unnest() 函数的有序结果

mysql - 通过 SQL 根据匹配模式从表中检索名称?

sql - 选择计数/重复

postgresql - 表约束中不存在 postgres 键

postgresql - 为什么我的 Play/Heroku/Postgres 部署失败并出现密码错误?

sql - 根据多个条件从表中删除重复项并保留到其他表