2015-06-18 58 views
0

有一個表Table1,其行顯示如下。列Label存儲列Tag的優先級。需要SQL查詢才能獲得條件輸出

同樣在列Label-L1是第一優先級,L2是第二優先級,L3是最低優先級。

我有Value列,其中保存標籤的值,可以爲空。

RecordNo. Lable Tag Value 
---------------------------------------------- 
1   L1  T1 
2   L2  T1 D12 
3   L3  T1 D13 
4   L1  T2 D21 
5   L2  T2 
6   L3  T3 
7   L2  T3 D31 
8   L2  T4 
9   L3  T4 D41 
10   L3  T5 D51 

我想編寫一個查詢得到如下的輸出。

對於每個標籤,如果找不到L1的值,那麼我們將搜索L2,如果找不到L2數據,則搜索L3。因此,在任何時候它都應該爲標籤返回非空值。

輸出如下所示。

RecordNo. Lable Tag Value 
--------------------------------------------------------- 
2   L2  T1 D12 
4   L1  T2 D21 
7   L2  T3 D31 
9   L3  T4 D41 
10   L3  T5 D51 

任何人都可以請檢查上面的查詢嗎?

在此先感謝。

+0

嗨,歡迎來到棧溢出。一般來說,在這裏我們希望你自己去看看,然後告訴我們你有任何代碼(即使它不工作)。我們可以幫助您調試您的代碼,但不會爲您編寫代碼。 –

+1

「任何人都可以請檢查上面的查詢」 - 看起來像你錯過了發佈它。請發佈您現在的問題 – Raj

回答

3

您可以使用ROW_NUMBER

;WITH Cte AS(
    SELECT *, 
     RN = ROW_NUMBER() OVER(PARTITION BY Tag ORDER BY Lable) 
    FROM Table1 
    WHERE Value IS NOT NULL 
) 
SELECT 
    RecordNo, Lable, Tag, Value 
FROM Cte 
WHERE RN = 1 

SQL Fiddle

+0

感謝您的評論,我只想知道是否有可能處理的情況下,如果標籤的優先級正在改變,即某些條件優先級是L1,L2,L3其中L1最高和L3是最不重要的。對於其他一些條件L2,L3,L1是優先級,其中L2最高且L1最不優先。 – user4916191

+0

你如何確定優先權?它是否存儲在一個表中? –

+0

標籤優先級不存儲在表中,它們由外部源控制。 – user4916191

0

CTE與敏應該做的伎倆

;WITH cte AS (
    SELECT Tag, 
      MIN(Lable) AS Lable 
    FROM Table1 
    WHERE Value IS NOT NULL 
    GROUP BY Tag 
) 
SELECT * 
FROM Table1 t1 
     JOIN cte c ON t1.Lable = c.Lable 
      AND t1.Tag = c.Tag 
0

使用此代碼:

create table #test 
(
Record_no int, 
label varchar(4), 
Tag varchar(4), 
Value varchar(6) 
) 
insert into #test values(1,'L1','T1','') 
insert into #test values(2,'L2','T1','D12') 
insert into #test values(3,'L3','T1','D13') 
insert into #test values(4,'L1','T2','D21') 
insert into #test values(5,'L2','T2','') 
insert into #test values(6,'L3','T3','') 
insert into #test values(7,'L2','T3','D31') 
insert into #test values(8,'L2','T4','') 
insert into #test values(9,'L3','T4','D41') 
insert into #test values(10,'L3','T5','D51') 

Select * from #test 

;With Cte as 
(
Select *,ROW_NUMBER() over (partition by tag order by tag) as rownum 
from #test 
where Value<>'' 
) 
select Record_no,label,tag,value from CTE 
where ROWNUM=1 

輸出:

Record_no label tag value 
    2   L2  T1 D12 
    4   L1  T2 D21 
    7   L2  T3 D31 
    9   L3  T4 D41 
    10   L3  T5 D51 
0

如果我們假設表名是記錄那麼該查詢將如下。

with recordcte(recordno, label, tag, value,Rank) as 
(select recordno, 
     label, 
     tag, 
     value, 
     rank() over(partition by Tag order by newid()) 
from records where value is not null) 
select recordno, 
     label, 
     tag, 
     value 
from recordcte where Rank=1 

以下查詢,這是CTE的定義(通用表表達式)

select recordno, label, tag, value, rank() over(partition by Tag order by newid() from records where value is not null)

是消除具有在值欄爲空並通過在劃分它們產生用於所述行的秩的行標籤值。

上CTE

select recordno, label,tag,value from recordcte where Rank=1 

下面的查詢將只顯示具有1級,這樣你會得到與也是第一個與該值關聯的值相關聯的標記行。

我希望這能滿足您的要求。

0

可以設置爲L1,L2,L3或L3,L1,L2或L2,L3的順序,L1


選擇不同LABLE,標籤,值從表1,其中拉布勒= L1 工會 選擇不同LABLE,標籤,值從表1,其中
拉布勒= L2和 標籤未中(選擇從表1明顯的標記,其中拉布勒中(L1)) 工會 選擇不同LABLE,標籤,值從表1,其中
拉布勒= L3和標籤不在(從表1中選擇不同的標籤(L1,L2))****