【发布时间】: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"
我想对它做如下操作-
查找列 B、M 和 X 的所有唯一组合。
对于每个这样的组合,找出对应的行数。
如果每个这样的 B、M 和 X 组合超过 1 行,请按照以下步骤将它们合并为一行。
在这些行中,如果其他列(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