我需要更新一个按价格排序的表,并重新分配已订购的价格。
价格和值按idcategory分组。下面是一个例子:
|ID | ID类别|价格|价值|
|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 | ID类别|价格|价值|
|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建议的最新工作解决方案:
使用OrderedValues作为
(选择值,
价格,
idcategory类,
ROULNUMLUBE()超过(按IDE类别按值排序)作为ValueNUM,
RoopNoMyBoE()超过(按ID分类按价格排序)作为PRICENUM
从T
),订单ID为
(选择ID,
idcategory类,
ROUMNUBLE()超过(按ID分类的IDCype顺序)作为RONNUM
从T
),新值为
(选择i.ID,
价值,
p.价格
来自OrderedIDs i
内部联接OrderedValues v
在i.RowNum=v.ValueNum上
和i.idcategory=v.idcategory
内部联接OrderedValues p
关于i.RowNum=p.PriceNum
和i.idcategory=p.idcategory
)
更新T
设定价格=v.价格,
价值=价值
来自NewValues v
其中v.ID=T.ID;
选择*
从T;

最佳答案

首先需要对id(orderedds)和价格/价值组合(ordereddvalues)进行排序。然后可以匹配相应的列组(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/

10-11 02:11