J*****u 发帖数: 44 | 1 现有如下一个Table
a GTL
b GTL
c GTL
我想得到如下三行输出
a b c GTL
b a c GTL
c a b GTL
请教这个sql语句该怎么写。
应用中,它是这么个意思,a和b,c兼容. b和a,c兼容。 c和a,b兼容。 a,b,c能兼容是
因为他们有共同属性GTL | B*****g 发帖数: 34098 | 2 为啥不是cba?
【在 J*****u 的大作中提到】 : 现有如下一个Table : a GTL : b GTL : c GTL : 我想得到如下三行输出 : a b c GTL : b a c GTL : c a b GTL : 请教这个sql语句该怎么写。 : 应用中,它是这么个意思,a和b,c兼容. b和a,c兼容。 c和a,b兼容。 a,b,c能兼容是
| J*****u 发帖数: 44 | 3 cba, cab 同等
【在 B*****g 的大作中提到】 : 为啥不是cba?
| B*****g 发帖数: 34098 | 4 recursive CTE
【在 J*****u 的大作中提到】 : cba, cab 同等
| B*****g 发帖数: 34098 | 5 似乎self join 再 agg就行了
【在 B*****g 的大作中提到】 : recursive CTE
| J*****u 发帖数: 44 | 6 能帮写个大概吗?
self join 怎么弄?
【在 B*****g 的大作中提到】 : 似乎self join 再 agg就行了
| w*r 发帖数: 2421 | 7 此例中只有三行,所以答案的列是4(3+1)列,结果应该是3!=6行,如果有四行,答案是
5列 4!行
如果要求是答案中abc/abc在一列里面,那么就要求有RECURSIVE CALL 做character
sequence permutation
如果知道一共输入有多少列(列数确定)可以简单的做inner join
CREATE VOLATILE TABLE t (
KEY1 VARCHAR(1),
KEY2 VARCHAR(3)
) PRIMARY INDEX(KEY1)
ON COMMIT PRESERVE ROWS;
INSERT INTO t VALUES('A','GTL');
INSERT INTO t VALUES('B','GTL');
INSERT INTO t VALUES('C','GTL');
SELECT T1.KEY1,T2.KEY1,T3.KEY1,T1.KEY2
FROM T T1
INNER JOIN
T T2
ON
T1.KEY2 = T2.KEY2 AND
T1.KEY1 <> T2.KEY1
INNER JOIN
T T3
ON
T2.KEY2=T3.KEY2
AND
T2.KEY1 <> T3.KEY1 AND
T1.KEY1 <> T3.KEY1
;
如果不知道多少列,要recursive. .我这里的例子是 ANSI recursive CALL
Volatile table 是针对Teradata platform SQL.
CREATE VOLATILE TABLE TT, NO FALLBACK AS(
SELECT SEQ_NUM1, T.KEY1,T.KEY2,
ROW_NUMBER() OVER (
PARTITION BY T.KEY2,SEQ_NUM1
ORDER BY T.KEY1) AS SEQ_NUM2
FROM T
INNER JOIN
(
SELECT ROW_NUMBER() OVER (
PARTITION BY KEY2
ORDER BY KEY1) AS SEQ_NUM1,
KEY2
FROM T
) A
ON T.KEY2 = A.KEY2
)WITH DATA
PRIMARY INDEX(SEQ_NUM1, SEQ_NUM2)
ON COMMIT PRESERVE ROWS;
WITH RECURSIVE PREV (SEQ_NUM1, KEY1, KEY2, SEQ_NUM2, TOTAL) AS(
SELECT SEQ_NUM1,
CAST(KEY1 AS VARCHAR(100)),
KEY2,
SEQ_NUM2,
SEQ_NUM1
FROM TT
WHERE SEQ_NUM1 = 1
UNION ALL
SELECT CURR.SEQ_NUM1,
TRIM(PREV.KEY1)||TRIM(CURR.KEY1),
CURR.KEY2,
CURR.SEQ_NUM2,
PREV.SEQ_NUM1+CURR.SEQ_NUM1
FROM PREV
INNER JOIN
TT CURR
ON
PREV.SEQ_NUM1 +1 = CURR.SEQ_NUM1 AND
PREV.SEQ_NUM2 <> CURR.SEQ_NUM2 AND
--- current string was not in the previous tree
INDEX(PREV.KEY1,CURR.KEY1) = 0
)
SEL *
FROM PREV
QUALIFY RANK () OVER (PARTITION BY key2 ORDER BY total DESC) = 1
;
【在 J*****u 的大作中提到】 : 现有如下一个Table : a GTL : b GTL : c GTL : 我想得到如下三行输出 : a b c GTL : b a c GTL : c a b GTL : 请教这个sql语句该怎么写。 : 应用中,它是这么个意思,a和b,c兼容. b和a,c兼容。 c和a,b兼容。 a,b,c能兼容是
| s**********o 发帖数: 14359 | 8 这不是P33的问题,应该是3×2=6行啊,为什么只有3行,你这个明明和数据库没什么关
系,
怎么显示是APPLICATION的问题,数据库只管存储 | J*****u 发帖数: 44 | 9 没错,怎么显示是application的问题。但是我的确碰到了这样的问题必须在sql里先得
到这样的显示结果,然后要结果要export到excel。嗯很感谢本版的牛人!学习了!
【在 s**********o 的大作中提到】 : 这不是P33的问题,应该是3×2=6行啊,为什么只有3行,你这个明明和数据库没什么关 : 系, : 怎么显示是APPLICATION的问题,数据库只管存储
| B*****g 发帖数: 34098 | 10 select *
from table t1, table t2
where t1.col2 = t2.col2
and t1.col1 <> t2.col1
然后再用你上次问的问题的答案
【在 J*****u 的大作中提到】 : 能帮写个大概吗? : self join 怎么弄?
| | | s**********o 发帖数: 14359 | 11 有暗含的BUSINESS LOGIC顺序没说清楚,a b兼容,b c兼容,a c一定兼容吗? | J*****u 发帖数: 44 | 12 a,b,c 之间能相互兼容是因为有共同属性GTL,不知道你指的顺序是什么意思?
【在 s**********o 的大作中提到】 : 有暗含的BUSINESS LOGIC顺序没说清楚,a b兼容,b c兼容,a c一定兼容吗?
| s**********o 发帖数: 14359 | 13 两个问题,
问题一,你默认a,b,c排序了,所以北京问你,为什么不是a, c, b,却是a, b,c,你要求
写出来的有排序要求,你自己说不出来顺序要求而已,你说是一样的,但你怎么告诉程
序他们是一样的,输出哪一个呢,只能是随机的了。
问题二,有没有可能A和B兼容,B和C兼容,A和C不兼容呢?如果有共同属性就兼容,其
实写出来的应该是GTL(a,b,c),括号里面没顺序,你要的三种结果是随机的,a,b,c,任
何一排列都是可能的,你不能说要一个不要另一个
【在 J*****u 的大作中提到】 : a,b,c 之间能相互兼容是因为有共同属性GTL,不知道你指的顺序是什么意思?
| w*r 发帖数: 2421 | 14 他要的就是基本的permutation, 原始数据里面没有任何表达出abc之间有关系,所以不
用费脑子了,就用我写的那个code就完了,当然你的DBA找你麻烦说你吧system cpu吃
完了不要来找我~~~LOL.... | J*****u 发帖数: 44 | 15 嗯,我来回答你这两个问题,很好!
你的第一个问题,a b c GTL 和 a c b GTL 属于同类的输出,只取其中一个。 如果你
说在这两个里头随机输出一个也是正确的。
你的第二个问题似乎和第一个问题是一样的。这么跟你说吧,
a b c GTL, a c b GTL 属于duplicated (应任取其一)
【在 s**********o 的大作中提到】 : 两个问题, : 问题一,你默认a,b,c排序了,所以北京问你,为什么不是a, c, b,却是a, b,c,你要求 : 写出来的有排序要求,你自己说不出来顺序要求而已,你说是一样的,但你怎么告诉程 : 序他们是一样的,输出哪一个呢,只能是随机的了。 : 问题二,有没有可能A和B兼容,B和C兼容,A和C不兼容呢?如果有共同属性就兼容,其 : 实写出来的应该是GTL(a,b,c),括号里面没顺序,你要的三种结果是随机的,a,b,c,任 : 何一排列都是可能的,你不能说要一个不要另一个
| s**********o 发帖数: 14359 | 16 那不就是一个简单的CURSOR问题么,
对于任何一个ITEM A,B,C,D,E,F
找到属性GTL
然后LIST所有有属性GTL(除A以为的)ITEM | J*****u 发帖数: 44 | 17 不知道你是否真的理解了题目。 用CURSOR也许有点跑偏了,因为整个record set会有
1Million records. 这样的话,系统可能有点吃不消。 用cursor你怎么解决输出问题?
【在 s**********o 的大作中提到】 : 那不就是一个简单的CURSOR问题么, : 对于任何一个ITEM A,B,C,D,E,F : 找到属性GTL : 然后LIST所有有属性GTL(除A以为的)ITEM
| s**********o 发帖数: 14359 | 18 CURSOR只是比较慢,但用的内存小,逻辑清楚,你不是每个ITEM都要出个OUTPUT么,
典型的CURSOR问题,如果弄个复杂的JOIN可能也行,但容易出错
用个XML就可以COMMA起来了
SELECT STUFF((SELECT ',' + item
FROM table
where
attribute ='GTL'
FOR XML PATH('')) ,1,1,'') AS item
题?
【在 J*****u 的大作中提到】 : 不知道你是否真的理解了题目。 用CURSOR也许有点跑偏了,因为整个record set会有 : 1Million records. 这样的话,系统可能有点吃不消。 用cursor你怎么解决输出问题?
| J*****u 发帖数: 44 | 19 很想知道这个怎么是典型cursor的问题? 小女不才,请赐教!
【在 s**********o 的大作中提到】 : CURSOR只是比较慢,但用的内存小,逻辑清楚,你不是每个ITEM都要出个OUTPUT么, : 典型的CURSOR问题,如果弄个复杂的JOIN可能也行,但容易出错 : 用个XML就可以COMMA起来了 : SELECT STUFF((SELECT ',' + item : FROM table : where : attribute ='GTL' : FOR XML PATH('')) ,1,1,'') AS item : : 题?
| O**K 发帖数: 11 | 20 DECLARE @Test AS TABLE (
id VARCHAR(10),
attr VARCHAR(100)
)
INSERT INTO @Test
SELECT 'a', 'GTL'
UNION ALL
SELECT 'b', 'GTL'
UNION ALL
SELECT 'c', 'GTL'
UNION ALL
SELECT 'd', 'GTL'
UNION ALL
SELECT 'e', 'GTL'
UNION ALL
SELECT 'f', 'ABC'
UNION ALL
SELECT 'g', 'ABC'
SELECT *
FROM @Test
---------------------------------------
SELECT a.id + ', ' + b.string, a.attr
FROM @Test AS a
CROSS APPLY (
SELECT STUFF(
(
SELECT N', ' + id
FROM @Test AS c
WHERE a.attr = c.attr
AND a.id <> c.id
FOR XML PATH('')
)
,1
,1
,''
) AS string
) AS b | a*******8 发帖数: 2 | 21 It can be done by pivot row into column:
c1 c2 c3 c4
a b c GTL
b c a GTL
...
INSERT INTO test VALUES ('a','GTL');
INSERT INTO test VALUES ('b','GTL');
INSERT INTO test VALUES ('c','GTL');
select max(case when col_letter = 'a' then col_letter end) as c1,
max(case when col_letter = 'b' then col_letter end) as c2,
max(case when col_letter = 'c' then col_letter end) as c3,
max(col_gtl) as c4
from test
union all
select max(case when col_letter = 'b' then col_letter end) as c1,
max(case when col_letter = 'c' then col_letter end) as c2,
max(case when col_letter = 'a' then col_letter end) as c3,
max(col_gtl) as c4
from test
....
【在 J*****u 的大作中提到】 : 现有如下一个Table : a GTL : b GTL : c GTL : 我想得到如下三行输出 : a b c GTL : b a c GTL : c a b GTL : 请教这个sql语句该怎么写。 : 应用中,它是这么个意思,a和b,c兼容. b和a,c兼容。 c和a,b兼容。 a,b,c能兼容是
|
|