【问题标题】:How to coalesce rows(X columns each) with same values for 3 columns in sqlite3 and prioratize the coalesce by a specific column vlaue?如何合并sqlite3中3列具有相同值的行(每列X列)并通过特定列值优先合并?
【发布时间】:2017-07-20 05:29:50
【问题描述】:

我有一个 sqlite3(通过 python3 交互)数据库表(名为“T”),看起来像 -

ID(PK)  A            B    ....  M  ....  N .....   P ..... X
_____________________________________________________________

 1  "string1"   "tom"       "Jim"    "Subway"   NULL    "Mr.Sub"
 2  "string2"   "tom"       "Jim"    "Hungry"   NULL    "Mr.Sub"
 3  "string3"   "tom"       "Jim"     NULL     "XBOX"   "Mr.Sub"
 4  "string1"   "Pam"       "Dave"    NULL     "GOLF"  "Starbucks"
 5  "string2"   "Pam"       "Dave"   "Arbys"    NULL   "Starbucks"
 6  "string1"   "Kyle"      "Ron"     NULL      NULL    "Gamers"
 7  "string4"   "Kyle"      "Ron"     NULL     "CART"   "Gamers"

我想对它做如下操作-

  1. 查找列 B、M 和 X 的所有唯一组合。

  2. 对于每个这样的组合,找出对应的行数。

  3. 如果每个这样的 B、M 和 X 组合超过 1 行,请按照以下步骤将它们合并为一行。

  4. 在这些行中,如果其他列(N、P 等)的值存在冲突,请从具有 A="string1" 的行中选择列的值。如果 A 为 NULL,则使用任何其他非 Null 值。如果所有值都为 NULL,则使用 NULL。

对于上面的例子,结果表应该像 -

ID(PK)  A            B    ....  M  ....  N ..... P ....   X
____________________________________________________________

 1  "string1"   "tom"       "Jim"    "Subway"  "XBOX"   "Mr.Sub"
 4  "string1"   "Pam"       "Dave"   "Arbys"   "GOLF"   "Starbucks"
 6  "string1"   "Kyle"      "Ron"     NULL     "CART"   "Gamers"

我能想到的解决方案是:

update a
set a.N = coalesce(a.N, b.N)
set a.P = coalesce(a.P, b.P)
from T a inner join T b
on a.B = b.B and a.M = b.M and a.X = b.X

这是基于博客文章 here 中给出的 mysql 示例。但是,这在 sqlite3 中不起作用,并且缺乏基于 A 列值的优先级。有人可以分享适用于 sqlite3 的正确查询吗?

【问题讨论】:

  • (每列 X 列)不是(每列 N 列)
  • Coalesece 不会像您认为的那样做。它将NULL 列值替换为另一个占位符。此外,除了UPDATE,您还需要DELETE 来删除旧数据。也许你应该告诉我们你为什么要这样做?
  • 我有一个数据库,该数据库每年对公司多次(主要是 2 次,最多 4 次)进行观察(对应于 A 列的值,例如 p1、p2、p3、p4),因为大部分信息是将相同,我想将所有信息折叠为每年仅一次,因此保留列 A=p1 的行的值,以防列可能具有不同的值。
  • 再一次,您在这里错误地使用了coalesce。您想组合聚合某些,而不是列,它们有一些共同点。
  • 谢谢蒂姆,我该怎么做?我不想结合本身(我只想坚持一个值(对应说,A = p1的行)不要连接它们)。

标签: sql python-3.x tsql sqlite


【解决方案1】:

合并操作可以描述如下:

  1. 对于每个string1 行,如果NP 值为NULL,则从同一B/M/X 组中具有非NULL 值的其他行中获取它们.
  2. 删除所有其他 stringX 行。
UPDATE T
SET N = (SELECT N
         FROM T AS T2
         WHERE T2.B = T.B
           AND T2.M = T.M
           AND T2.X = T.X
           AND T2.N IS NOT NULL)
WHERE A = 'string1'
  AND N IS NULL;

UPDATE ...   -- same for P

DELETE FROM T
WHERE A <> 'string1';

【讨论】:

  • “N 型”和“合并”是什么意思?举个例子。
  • 嗨 CJ,我已经编辑了我的问题。请查看突出显示的内容。
  • 显示一个例子。
  • 我现在已经将我的示例编辑得非常详细。希望对您有所帮助。
  • 恐怕这个问题现在被埋没了。不确定 SO 是如何工作的,人们有没有机会看到这个?
猜你喜欢
  • 2021-10-15
  • 1970-01-01
  • 1970-01-01
  • 2022-01-11
  • 2017-01-08
  • 1970-01-01
  • 2023-03-15
  • 1970-01-01
  • 2012-07-12
相关资源
最近更新 更多