【问题标题】:Update table with ordered values使用有序值更新表
【发布时间】:2014-01-18 15:14:54
【问题描述】:

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

|身份证 | 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类别 |价格 |价值 | | 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 作为 (选择值, 价钱, id类别, ROW_NUMBER() OVER(PARTITION BY idcategory ORDER BY Value) AS ValueNum, ROW_NUMBER() OVER(PARTITION BY idcategory ORDER BY Price) AS PriceNum 从T ), OrderedIDs AS (选择 ID, id类别, ROW_NUMBER() OVER(PARTITION BY idcategory ORDER BY ID) AS RowNum 从T ), 新值作为 (选择 i.ID, v.价值, p.价格 FROM OrderedIDs 我 内连接 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 ) 更新 T SET 价格 = v.Price, 价值 = v.价值 来自 NewValues v 哪里 v.ID = T.ID; 选择 * 从T;

【问题讨论】:

  • 你是如何确定这些数据的顺序的?
  • ASC 的价格和价值

标签: sql postgresql postgresql-9.2


【解决方案1】:

您首先需要对您的 ID (OrderedIDs) 和价格/价值组合 (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

【讨论】:

  • 我必须调整查询,因为它没有考虑按 idcategory 分组。 price 和 value 必须按 id_category 分组。谢谢
  • 谢谢,但价格不是按顺序排列的,只是数值。我将尝试修改查询。再次感谢您
  • 只需更改OrderedValues CTE 中ROW_NUMBER 函数的ORDER BY 部分内的列。只要分区保持不变,您就可以随意订购。
猜你喜欢
  • 2018-03-16
  • 2019-08-06
  • 1970-01-01
  • 2021-01-17
  • 2014-01-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多