2017-02-15 105 views
0

我有这样的查询,需要帮助建立一个SQL

SELECT DISTINCT X,Y,Z from ABC; 

假设它产生的结果一样,

  X    | Y | Z 
------------------------|--------|------ 
a/b/c/34y3bkfoi   | Data1 | Data2 
a/b/c/56egdhdhh   | Data1 | Data2 
a/b/c/h5747858i   | Data1 | Data2 
a/b/c/657sgsr65   | Data1 | Data2 
x/y/z/67dhgg45h   | Data1 | Data2 
x/y/z/6hd467ydh   | Data1 | Data2 

现在我想小组第一列的只有高达的数据“一/公元前'。我不在乎其他的东西。

或简单地把我想DISTINCT必须应用于特定的上下文'%/%/%/'。

预期结果:

 X  | Y | Z 
------------|--------|------ 
a/b/c/  | Data1 | Data2 
x/y/z/  | Data1 | Data2 

任何建议?

+1

您使用的是MS SQL Server或MySQL或Oracle ...不标记随机dbms产品。只标记你正在使用的那个。 – jarlh

+0

使用该表格数据,指定预期结果! – jarlh

+0

是否只有a/b/c或者a/a/b? –

回答

1

您可以使用SUBSTR与INSTR这样的:

select substr(X, 1, Instr(X, '/', -1) - 1) as X1, substr(X, Instr(X, '/', -1) + 1) as X2, Y, Z 
from 
(select 'a/b/c/35235235' as X, 'Data1' as Y, 'Data2' as Z from dual); 

输出为:

X1 | X2  | Y | Z 
------------------------------ 
'a/b/c'|'35235235'|Data1|Data2 

那么你group by X1

+0

我想,这会做。我会努力工作,并回复 – Codewarrior

+0

感谢您的提示。我得到了预期的产出。 – Codewarrior

+0

你能将我的答案标记为答案吗? ^。^ –

1

这是你所需要的?

SELECT DISTINCT X,Y,Z from ABC WHERE X LIKE 'a/b/c/%' 
0

使用DISTINCTLEFT

SELECT DISTINCT LEFT(X, 6) 
     -- Uncomment if you need 2nd and 3rd column as well 
     --,Y 
     --,Z 
FROM ABC 
+0

我想你错过了Y和Z'SELECT'条款 – Petaflop

0

试试这个:

SELECT X, Y, Z, t.i, 
     LEFT(X, LEN(X) - t.i + 1), 
     RIGHT(X, t.i - 1) 
FROM ABC 
CROSS APPLY (SELECT CHARINDEX('/', REVERSE(X))) AS t(i) 

要选择不同,您可以使用ROW_NUMBER

;WITH CTE AS (
    SELECT X, Y, Z, t.i, 
      LEFT(X, LEN(X) - t.i + 1) AS l, 
      RIGHT(X, t.i - 1) AS r, 
      ROW_NUMBER() OVER (PARTITION BY LEFT(X, LEN(X) - t.i + 1) 
           ORDER BY X) AS rn 
    FROM ABC 
    CROSS APPLY (SELECT CHARINDEX('/', REVERSE(X))) AS t(i) 
) 
SELECT 
FROM CTE 
WHERE rn = 1 
+0

感谢您的努力 – Codewarrior

0

谢谢你们。 我得到了预期的输出使用,

SELECT DISTINCT(SUBSTR(X,1,INSTR(X,'/',1,3))),Y,Z from ABC;