SQL - 如果两行具有相同的日期,则仅显示具有特定列值的行

时间:2016-02-03 21:13:12

标签: sql-server tsql duplicates rows where-clause

是否有办法通过使用另一个nvarchar列来显示具有相同日期和id的两行中的一行。

如果我有:

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

如果行具有相同的groupID和日期,并且如果行中的任务之一为“First Task”,则仅显示具有“First Task”任务的行。

如果行具有相同的groupID和Date,但没有行具有“First Task”任务,则显示所有行。

3 个答案:

答案 0 :(得分:1)

您可以使用row_number function设置每个组的任务位置,然后只保留位置设置为1的记录。因此,在以下查询中,名为“First task”的任务将具有第一个位置。如果没有这样的任务,那么你可以让SQL引擎选择哪一个是第一个,但这是一个bad practice。所以为此,我在这里指定了Task的字母顺序。

所以这意味着,'第一个任务'是第一个,否则'另一个任务'是。

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:UPPER用于处理可能的数据不规则,如“First Task”,“first task”。

答案 1 :(得分:1)

您可以将列Row_number与分区一起使用,此列为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

答案 2 :(得分:1)

只给出您的样本数据和规定的要求,我会这样做:

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有多行,并且它们都没有任务的“First Task”,那么将随机选择一行。