2016-02-03 63 views
0

是否有方法通過使用另一個nvarchar列來顯示具有相同日期和id的兩行中的一行。SQL - 如果兩行具有相同的日期,只顯示具有某個列值的行

,如果我有:

groupID  Date   Task 
1   1-01-1111 First Task 
2   1-02-1122 First Task 
2   1-02-1122 Second Task 
3   1-03-1133 Second Task 
3   1-03-1133 Third Task 

我想獲得:

groupID  Date   Task 
1   1-01-1111 First Task 
2   1-02-1122 First Task 
3   1-03-1133 Second Task 
3   1-03-1133 Third Task 

如果行具有相同的組ID和日期,如果行的任務之一是,「第一要務」僅顯示具有「第一任務」任務的行。

如果行具有相同的groupID和Date,但沒有行具有「First Task」任務,則顯示所有行。

+1

「另一個任務」是如何出現的? – AXMIM

+1

另外,你將如何決定哪一個任務是保持在一組中? –

+1

如果有兩行具有相同日期,且他們兩個都沒有任務列的「第一個任務」,會發生什麼? –

回答

1

僅給出您的樣本數據,並表示要求您可以使用列ROW_NUMBER與分區,我會做這樣的:

WITH cte AS (
    SELECT *, 
    ROW_NUMBER() OVER (Partition By GroupId, [Date] ORDER BY CASE 
     WHEN Task = 'First Task' THEN 0 
     ELSE 1 
    END ASC) 
    FROM MyTable 
) 
SELECT GroupId, [Date], Task FROM cte 

如果一個給定的GroupId和Date有多行,並且它們都沒有任務的「第一個任務」,那麼隨機選擇一個。

+0

每個人都在正確的軌道上,但是在分區的ORDER BY部分中使用CASE是我真正需要的,以期望的方式排列任務以獲得所需的結果。我結束了選擇並將其置於LEFT JOIN中。 –

1

您可以使用row_number function設置每個組的任務位置,然後只保留位置設置爲1的記錄。因此,在以下查詢中,名爲「第一個任務」的任務將具有第一個位置。如果沒有這樣的任務,那麼你可以讓SQL引擎選擇哪一個是第一個,但這是一個bad practice。爲此,我在這裏指定了任務的字母順序。

所以這意味着'第一個任務'是第一個,否則'另一個任務'是。

SELECT groupID, 
     [Date], 
     Task 
FROM (SELECT groupID, 
       [Date], 
       Task, 
       i = ROW_NUMBER() OVER(PARTITION BY groupID, [Date] ORDER BY CASE WHEN UPPER(Task) = 'FIRST TASK' THEN 0 ELSE 1 END, Task) 
     FROM @YourTableName) AS t 
WHERE i = 1 --Only show the first row for a group with same groupID and Date 

N.B:上層是用於處理可能的數據不規則,像「第一任務」,「首要任務」。

+0

使用字母順序,「第八個任務」會在「第一個任務」之前出現。 –

+0

這在我的情況下不起作用,因爲任務是nvarchar,所以它們不能按數字排序。 –

+0

@demetrick對不起,我教過「第一項任務」只是一個簡化問題的例子。我更新了答案,並處理了「沒有第一個任務」的情況。 – AXMIM

1

其中該列爲1

select * from (
    Select groupID, Date, Task 
    , row_number() over (Partition by goupId, Date, order by groupId, Date, Task) as line 
) as t1 
where 
    t1.line = 1 
+0

這幾乎奏效,但需要一種方法來訂購任務,因爲數據庫不會按數字來完成它。 –

相關問題