This topic has been archived. It cannot be replied.
-
工作学习 / 专业技术讨论 / bdbs请进,我也给你出道SQL题....MS SQL,跟你的行转列的问题比较相似,但比那个复杂点:
table :tbl1 (id int not null, col1 varchar(100) null)
ID上有index.
ID是unique的。但是一个ID可以对应有N多个不定长字串col.
sample data:
1 AB
1 CDED
2 FGHI
2 K
2 LMNOPQ
3 R
3 ST
3 U
3 V
...
需要得到"总长度"最短的前20 (top20) 个ID, 每个ID的最短前3个的col1的值.
3 R
3 U
3 V
...
--假设1和2都没满足长度最短的条件
-hard20(hard20);
2006-11-9
{384}
(#3311641@0)
-
my answerselect rank = count(*), t1.id, t1.col1
from table as t1, table as t2
where len(t1.col1) >= len(t2.col1)
group by t1.id
order by rank
having rank < 21
-piglet(be nice);
2006-11-9
{154}
(#3311723@0)
-
先把题目搞清楚。假如按照你的例子,假如col1总长度为1的所有行不够20,是否要接着输出长度为2的,如果还不够,输出长度为3的?
3 R
3 U
3 V
1 AB
...
-bdbs(不多不少);
2006-11-9
{130}
(#3311736@0)
-
这回我不说最短了,我说最长。重新举例
假设 tbl1 是一个论坛回复帖子的 事物表
ID 是每个用户的 ID啦, col1就是一个ID回复帖子的内容。现在要找到 “ 在回贴总字数最多的20个ID 中 找到 每个ID 和 此ID 单篇回复字数最少的3个帖子内容。"
-hard20(hard20);
2006-11-9
{97}
(#3311767@0)
-
呵呵,先说说你是哪个坛子的老大,想干啥来着?
-bdbs(不多不少);
2006-11-9
(#3311790@0)
-
我只是那论坛做个例子。。。:)))
-hard20(hard20);
2006-11-9
(#3311827@0)
-
好吧,等一会儿空了给你做题。不过我觉得这个跟你上面那个不一样。也许上面那个是你没解释清楚吧。
-bdbs(不多不少);
2006-11-10
(#3312378@0)
-
答案来了。这个题目有点tricky的,标准SQL一个QUERY无法实现。
SELECT col1
FROM ( SELECT id,
col1,
RANK() OVER (PARTITION BY id order by datalength(col1)) as RANK
FROM tbl1
) a
JOIN ( SELECT TOP 20 id
FROM tbl1
GROUP BY id
ORDER BY SUM(DATALENGTH(col1)) DESC
) b
ON a.id = b.id
AND a. rank <= 3
-bdbs(不多不少);
2006-11-10
{401}
(#3312516@0)
-
除了那个TOP 20,看起来跟 ORACLE 很像呀。楼主可能在上班呢,我先给你提个建议你的子查询 a 可再优化,只对 TOP 20 的 ID 作RANK就可以了。
-newkid(newkid);
2006-11-10
{57}
(#3312583@0)
-
谢谢提醒。俺也在上班呢,忙里偷闲做的功课,其实自己也不太满意,比#3308858差多了。要不是LZ点名要我做,我肯定得留到晚上再去动这个脑筋的。
-bdbs(不多不少);
2006-11-10
(#3312621@0)
-
ORACLE 的 ANALYTIC 函数轻松搞定,我就不用说了吧。
-newkid(newkid);
2006-11-9
(#3311842@0)
-
捣乱吧你? 都说了 MS SQL,注意看题!!!
-hard20(hard20);
2006-11-9
(#3311861@0)
-
我当然知道了,你们两个MS FANS慢慢玩,我就不打搅了,呵呵……
-newkid(newkid);
2006-11-9
(#3311907@0)