是否有办法通过使用另一个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”任务,则显示所有行。
答案 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”,那么将随机选择一行。