2010-01-29 80 views
1

我有一个大型的数据集,其中一些是重复记录,这些记录可以通过两个字段中的dupe进行识别。重命名数据,然后删除重复项

要找到这些记录,下面的查询工作:

SELECT * FROM supplierstuffs 
GROUP BY "Supplier Code", "Cost ex Tax" 
HAVING count("Description") > 1 

基本上就是我想要做的是猫在一起“说明”的所有值,形成一排,然后更换所有重复的行与单排。

这是我截至目前为止的一半查询,它是可怕和可怕的。我的主要目标是实现这一目标 - 但如果我在学习sql的过程中学习一些新的技巧,那并不是件坏事。

UPDATE supplierstuffs SET "Description" = 
(SELECT array_to_string(array_accum("Description"), ', ') FROM supplierstuffs 
GROUP BY "Supplier Code", "Cost ex Tax" 
HAVING count("Description") > 1) 
WHERE ..... 

这就是我得到的。我应该阅读什么来进一步了解?我已阅读了几本书和关于该主题的大量网页。然而在这种情况下,我认为我的问题并不限于缺少SQL(好吧,这不是我的只有的问题),但更多的接近错误的方式。

编辑1:

'Name'; 'Supplier Code'; 'Desciption'; 
"7CPS PODIUM S/SLV CRICKET POLO";"7CPS";"04 -14, S - 3XL" 
"7CP PODIUM CRICKET PANT ";"7CP";"08 -14, S - 2XL" 
"7CPT PODIUM 3/4 SLV CRICKET POLO";"7CPT";"04 -14, S - 3XL" 
"7CPL PODIUM L/SLV CRICKET POLO";"7CPL";"04 -14, S - 3XL" 
"T444MS Cool dry breathable sporty T-shirts";"T444MS";"XS - 2XL, XS - 2XL" 
"T232RG Raglan Sleeve Tee";"T232RG";"XS - 3XL, 8-16" 

^^是我想从VV

"T232RG Raglan Sleeve Tee";"T232RG";"XS - 3XL" 
"T232RG Raglan Sleeve Tee";"T232RG";"XS - 3XL" 
"T232RG Raglan Sleeve Tee";"T232RG";"S - 3XL" 
"T232RG Raglan Sleeve Tee";"T232RG";"XS - 3XL" 
"T232RG Raglan Sleeve Tee";"T232RG";"XS - 3XL" 
"T232RG Raglan Sleeve Tee";"T232RG";"XS - 3XL" 
"T232RG Raglan Sleeve Tee";"T232RG";"XS - 3XL" 
"T232RG Raglan Sleeve Tee";"T232RG";"XS - 3XL" 
"T232RG Raglan Sleeve Tee";"T232RG";"8-16" 
"T232RG Raglan Sleeve Tee";"T232RG";"XS - 3XL" 
"T232RG Raglan Sleeve Tee";"T232RG";"XS - 3XL" 
"T232RG Raglan Sleeve Tee";"T232RG";"XS - 3XL" 
"T232RG Raglan Sleeve Tee";"T232RG";"XS - 3XL" 
"T232RG Raglan Sleeve Tee";"T232RG";"XS - 3XL" 
"T232RG Raglan Sleeve Tee";"T232RG";"XS - 3XL" 
"T232RG Raglan Sleeve Tee";"T232RG";"XS - 3XL" 
"T444MS Cool dry breathable sporty T-shirts";"T444MS";"XS - 2XL" 
"T444MS Cool dry breathable sporty T-shirts";"T444MS";"XS - 2XL" 
"T444MS Cool dry breathable sporty T-shirts";"T444MS";"XS - 2XL" 
"T444MS Cool dry breathable sporty T-shirts";"T444MS";"XS - 2XL" 
"7CP PODIUM CRICKET PANT ";"7CP";"08 -14" 
"7CP PODIUM CRICKET PANT ";"7CP";"S - 2XL" 
"7CPL PODIUM L/SLV CRICKET POLO";"7CPL";"04 -14" 
"7CPL PODIUM L/SLV CRICKET POLO";"7CPL";"S - 3XL" 
"7CPS PODIUM S/SLV CRICKET POLO";"7CPS";"04 -14" 
"7CPS PODIUM S/SLV CRICKET POLO";"7CPS";"S - 3XL" 
"7CPT PODIUM 3/4 SLV CRICKET POLO";"7CPT";"04 -14" 
"7CPT PODIUM 3/4 SLV CRICKET POLO";"7CPT";"S - 3XL" 

^^指出的是,不具有行超过一个描述行需要保持不变创造什么。

我到目前为止已经有创建的新记录的新表:

INSERT INTO tmptable 
SELECT "Name" , "Supplier Code", array_to_string(array_accum("Description"), ', ') 
FROM supplierstuffs 

GROUP BY "Name", "Supplier Code", "Description" 
    HAVING count("Description") > 1 

所以现在剩下的工作就是删除由cat命令被抓的记录。看来我不能DELETE FROM有条款吗?我在想,DELETE FROM table WHERE oid IN (SELECT OID's using having clause)会工作吗?

编辑2:

SELECT array_accum(oid) 
FROM supplierstuffs 

GROUP BY "Name", "Supplier Code", "Colour", "Cost ex Tax" 
    HAVING count("Description") > 1 

返回2点的OID,所有这些都需要被delorted几个阵列。我觉得我非常接近,但迄今为止。 在此先感谢

+0

@Richo - 你问你怎么能更好地解释它。你可以给出你所拥有的数据和你想要的数据的例子。我用这个最好的猜测重写了我的答案。如果您编辑您的伫列以包含此类信息,这将是一个好主意;例子总是让事情更清楚。 – APC 2010-01-29 06:48:33

+0

@APC - 谢谢,我会把它放在船上。我会在接下来的几分钟内用一些示例数据和我所在的位置更新这个问题。 再次感谢。 – richo 2010-01-29 06:57:53

回答

0

所以,你目前所拥有的是这样的事情...

DESCRIPTION   SUPPLIER_CODE COST_EX_TAX 
Widget     X23     42.00 
Brass gadget   X23     42.00 
Flange     X42     23.00 
Flange, steel   X42     23.00 

...你想要的是......

DESCRIPTION   SUPPLIER_CODE COST_EX_TAX 
Brass gadget, Widget X23     42.00 
Flange, Flange, steel X42     23.00 

这还不似乎是正确的方法。这个级联描述对我来说似乎是错误的。但是,您比我更了解您的数据和客户的要求。

+0

我想也许我没有正确解释(不知道如何在短语标题中加上短语..) 我正在做的事是用新数据改变行,然后删除重复行,留下一行对于每个..这是否更有意义?我将如何描述这个过程? – richo 2010-01-29 05:44:27

+0

噢,这个模糊的原因是我从客户列表中导入数据到我们的系统中,因为他们的旧目的,客户数据格式有效,但它不适合我们的模型。 – richo 2010-01-29 05:48:59

+0

这正是我所追求的! 不过我想我可能已经用bkm的解决方案对它进行了排序。 – richo 2010-01-29 06:47:00

2

下面的方法将工作

  1. 只能识别重复的行 并将其存储在一个新表。
  2. 从父 表
  3. 串接在仅含 重复行的表中的描述 列的删除重复的行。使用 group by子句进行连接。
  4. 将步骤3的结果中的所有行 插入 原始表中。
+0

谢谢bkm。我可以进入临时表,我对它是如何真正改变我的问题有点模糊?我试图用一个团队来做到这一点,但并没有真正到达任何地方。更具体地说,我不知道如何将行移动到我不感兴趣的行数较少(但不是0)的表上有帮助? 你有任何链接? – richo 2010-01-29 05:58:10

+0

哦,等等,我想我只是得到它: 1)创建临时表 2)插入由猫+组只产生精行到临时表 3)软管在原表 4所有的受骗者)只有重新插入从临时表中清理行? 谢谢,我会试试看。 – richo 2010-01-29 06:01:34