由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
Database版 - 求SQL 难题
相关主题
请问sql 有条件性的select columnsSQL select one value column for each distinct value another (转载)
How to get other columns after UNION?如何寫此 SQL 查詢?
any group function reutrn null if there is null value?Re: How to concatenate NULL value with a string in SQL Server?
如何除去duplicate rows?新手问题求助
mysql mapping and insert question关于SQL Server的string function
SQL 2008 Group By QuestionUrgent SQL problem!
请教一个SQL的问题beijing呀,教教我怎么optimize sql server吧。
SQL copy a table into a new table and add a new columnmySQL 问题 (转载)
相关话题的讨论汇总
话题: 111话题: bbb话题: start话题: groupid
进入Database版参与讨论
1 (共1页)
o*******8
发帖数: 249
1
用的是 SQL SERVER 2014
数据仓库里的维度表需要将相同的row 合并,同时update 起止日期。
因为表很大,大约300个column,几十个M 的记录。
所以我用了Binary_CheckSum。 现在得出下面的记录。col1,col2只是节选,有200多
个。
BinaryCheckSum 只计算col1,col2 等等需要比较的attributes。
下面的记录,1和2需要合并成一行,start 20161017, end 20170105.
5 和6 需要合并成一行,start 20170126, end NULL
我初衷是想用BinaryCheckSum来合并,但是1和2合并就会把4也合并了,是不对的。
如果数据量小,可以有很多办法做,但是表非常大,不想用selfjoin,merge等,太难
写了。
有什么好办法?下午在办公室想的头疼。
Id GroupId col1 col2 Start End BinaryCheckSUm
1 111 aaa bbb 20161017 20161214 1455015
2 111 aaa bbb 20161215 20170105 1455015
3 111 aa1 bbb 20170106 20170111 67850
4 111 aaa bbb 20170112 20170125 1455015
5 111 aa1 bbb 20170126 20170215 67850
6 111 aa1 bbb 20170216 NULL 67850
7 112 ccc dd2 20161117 20161208 45345
十分感谢!
o*******8
发帖数: 249
2
补充一下,上面排好的记录,同一个groupId里面起止日期都是相连的没有空期。
就是说,把 BinaryCheckSum 相同 并且是连续相邻的 row 合并在一起。
可是,这个“连续相邻” 的关系怎么用表达式表达出来呢?
b******7
发帖数: 123
3
Store procedure?
l****x
发帖数: 87
4
除非是实时表,有大量数据涌入,否则直接写个程序处理多容易呀。
o******1
发帖数: 44
5
可以试试 cte + windows function lag() over (), 可以小批量测试performance
h****e
发帖数: 268
6
Select
groupid,col1,col2,min(startdate ),max(enddate),binarychecksum
From table
Group by groupid,col1,col2,binarychecksum
Having max(startdate) = dateadd(day,1,min(enddate))
h****e
发帖数: 268
7
Run your query execution plan for some data and see if there is any missing
indexes before running it on your big table. Always check if you have enough
tempdb and log space.
You might be able to divide them into small batches by using where
conditions in the id range.
o*******8
发帖数: 249
8
你这样group会把1,2,4 group在一起,然后having的时候又被filter掉了,等于1,2,4
这三行全没了。

【在 h****e 的大作中提到】
: Select
: groupid,col1,col2,min(startdate ),max(enddate),binarychecksum
: From table
: Group by groupid,col1,col2,binarychecksum
: Having max(startdate) = dateadd(day,1,min(enddate))

a*********y
发帖数: 63
9
你说得对. 早上看到这段的时候就觉得有问题.

4

【在 o*******8 的大作中提到】
: 你这样group会把1,2,4 group在一起,然后having的时候又被filter掉了,等于1,2,4
: 这三行全没了。

a*********y
发帖数: 63
10
用Cursor对每一个Binary_CheckSum选出小数据集, 再self join?
用数据库的优势就在于能用SQL join,否则的话跟写程序就没区别了.

【在 o*******8 的大作中提到】
: 用的是 SQL SERVER 2014
: 数据仓库里的维度表需要将相同的row 合并,同时update 起止日期。
: 因为表很大,大约300个column,几十个M 的记录。
: 所以我用了Binary_CheckSum。 现在得出下面的记录。col1,col2只是节选,有200多
: 个。
: BinaryCheckSum 只计算col1,col2 等等需要比较的attributes。
: 下面的记录,1和2需要合并成一行,start 20161017, end 20170105.
: 5 和6 需要合并成一行,start 20170126, end NULL
: 我初衷是想用BinaryCheckSum来合并,但是1和2合并就会把4也合并了,是不对的。
: 如果数据量小,可以有很多办法做,但是表非常大,不想用selfjoin,merge等,太难

相关主题
请教一个SQL的问题如何寫此 SQL 查詢?
SQL copy a table into a new table and add a new columnRe: How to concatenate NULL value with a string in SQL Server?
SQL select one value column for each distinct value another (转载)新手问题求助
进入Database版参与讨论
o*******8
发帖数: 249
11
用cursor的话都不需要self join了。从第一行开始给个行号为1,第二行如果checksum
和上一行一样就还是1,不一样加 1,这样每次都是每两行进行比较,以此类推就行了
。然后按行号和checksum group就行了。
想找到不用cursor 的方法,因为表太大了。找不到就用cursor了,毕竟再多数据,也
只是简单的加1的操作。
我在解这个问题的时候就体会到,SQL server 的window function 缺少一个running
ranking的功能,就是窗口分割好以
后,每个窗口里面逐行比较。类似running summary的功能。希望微软以后能加上。

【在 a*********y 的大作中提到】
: 用Cursor对每一个Binary_CheckSum选出小数据集, 再self join?
: 用数据库的优势就在于能用SQL join,否则的话跟写程序就没区别了.

O**K
发帖数: 11
12
提个思路吧。
- 复制这个table,但set NewStart = ISNULL(dateadd(d,1,End), Start), Id的值改一
下, 这样你可以得到
Id GroupId col1 col2 NewStart End BinaryCheckSUm
A1 111 aaa bbb 20161215 20161214 1455015
A2 111 aaa bbb 20170106 20170105 1455015
A3 111 aa1 bbb 20170112 20170111 67850
A4 111 aaa bbb 20170126 20170125 1455015
A5 111 aa1 bbb 20170216 20170215 67850
A6 111 aa1 bbb 20170216 NULL 67850
A7 112 ccc dd2 20161209 20161208 45345
- Combine two tables using 'UNION ALL'
- 把 Start列加到binary_checksum 的expression里,重新计算checksum
- checksum 相同的表示存在‘连续相邻’, 例如
Id GroupId col1 col2 Start End BinaryCheckSUm
2 111 aaa bbb 20161215 20170105 *******
A1 111 aaa bbb 20161215 20161214 *******
- 以下的分离,合并等应该很容易了。

【在 o*******8 的大作中提到】
: 用的是 SQL SERVER 2014
: 数据仓库里的维度表需要将相同的row 合并,同时update 起止日期。
: 因为表很大,大约300个column,几十个M 的记录。
: 所以我用了Binary_CheckSum。 现在得出下面的记录。col1,col2只是节选,有200多
: 个。
: BinaryCheckSum 只计算col1,col2 等等需要比较的attributes。
: 下面的记录,1和2需要合并成一行,start 20161017, end 20170105.
: 5 和6 需要合并成一行,start 20170126, end NULL
: 我初衷是想用BinaryCheckSum来合并,但是1和2合并就会把4也合并了,是不对的。
: 如果数据量小,可以有很多办法做,但是表非常大,不想用selfjoin,merge等,太难

m******1
发帖数: 77
13
不用join,可以考虑写个function找end。
直接写不知道怎么不用join
给你一个用join的,代码参考了的其它大神的思路
1)导入的日期都是文本,所以代码中日期简化为了数字操作
2)把null替换了个大数字
3) 为省事只select了关键列,其它自己添加
4)递归效率可能不高,请高手提些简化意见。
5)如果可以运行请楼主告知效率如何
怎么不能贴代码?代码见下图
m******1
发帖数: 77
14
如果一个项目不只两行,有3行以上 你的方法可行吗?

【在 O**K 的大作中提到】
: 提个思路吧。
: - 复制这个table,但set NewStart = ISNULL(dateadd(d,1,End), Start), Id的值改一
: 下, 这样你可以得到
: Id GroupId col1 col2 NewStart End BinaryCheckSUm
: A1 111 aaa bbb 20161215 20161214 1455015
: A2 111 aaa bbb 20170106 20170105 1455015
: A3 111 aa1 bbb 20170112 20170111 67850
: A4 111 aaa bbb 20170126 20170125 1455015
: A5 111 aa1 bbb 20170216 20170215 67850
: A6 111 aa1 bbb 20170216 NULL 67850

O**K
发帖数: 11
15
这个方法很繁琐,解决楼主的简单例子也许可行,但对于同一GroupID里有多个不连续
dupeset的情况又有一番周折,这样意思就不大了。也许可以试试recursive query.

【在 m******1 的大作中提到】
: 如果一个项目不只两行,有3行以上 你的方法可行吗?
m******1
发帖数: 77
16
之前代码有问题,对题目理解不正确,想多了
a*********y
发帖数: 63
17
我的意思是说 divide and conquer. 对每一个checksum, 把对应的记录单独选出来处
理, 比如说放在另外一个临时表里.这样一来数据量会小很多,你就可以用SQL了. 并不
是真让你用 cursor 去一行一行地去处理.

checksum

【在 o*******8 的大作中提到】
: 用cursor的话都不需要self join了。从第一行开始给个行号为1,第二行如果checksum
: 和上一行一样就还是1,不一样加 1,这样每次都是每两行进行比较,以此类推就行了
: 。然后按行号和checksum group就行了。
: 想找到不用cursor 的方法,因为表太大了。找不到就用cursor了,毕竟再多数据,也
: 只是简单的加1的操作。
: 我在解这个问题的时候就体会到,SQL server 的window function 缺少一个running
: ranking的功能,就是窗口分割好以
: 后,每个窗口里面逐行比较。类似running summary的功能。希望微软以后能加上。

m******1
发帖数: 77
18
看这次题目理解的正确吗?
代码见下图
o*******8
发帖数: 249
19
这个是对的,谢谢。稍微改一下就是:
ROW_NUMBER() OVER(PARTITION BY GroupId ORDER BY Start) -
ROW_NUMBER() OVER(PARTITION BY GroupId, BinaryCheckSum ORDER BY Start) as rn.

【在 m******1 的大作中提到】
: 看这次题目理解的正确吗?
: 代码见下图

S*****N
发帖数: 16
20
test
1 (共1页)
进入Database版参与讨论
相关主题
sql query helpmysql mapping and insert question
菜鸟问题,急SQL 2008 Group By Question
A rookie's query question请教一个SQL的问题
问个sql/ ssis的问题 谢谢!SQL copy a table into a new table and add a new column
请问sql 有条件性的select columnsSQL select one value column for each distinct value another (转载)
How to get other columns after UNION?如何寫此 SQL 查詢?
any group function reutrn null if there is null value?Re: How to concatenate NULL value with a string in SQL Server?
如何除去duplicate rows?新手问题求助
相关话题的讨论汇总
话题: 111话题: bbb话题: start话题: groupid