我需要更新一个按价格排序的表,并重新分配已订购的价格。
价格和值按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/