SQL - 如果两行具有相同的日期,则只显示具有特定列值的行
SQL - If two rows have the same date, only show row with certain column value
有没有办法通过使用另一个 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
如果行具有相同的组 ID 和日期,并且如果行中的任务之一是 "First Task",则仅显示任务为 "First Task" 的行。
如果行具有相同的组 ID 和日期,但没有行的任务为 "First Task",则显示所有行。
您可以使用 row_number function to set task position per group and then just keep record with position set to 1. So in the following query, a task named "First task" will have the first position. If there is no such task, then you could let the SQL engine choose which one will be first, but this is a bad practice。因此,为此,我在这里指定了 Task 的字母顺序。
所以这意味着,'First task'是第一个,否则'another 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'.
您可以将列 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
只给定您的样本数据和规定的要求,我会这样做:
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 有多个行,其中 none 个有 "First Task" 个任务,那么将随机选择一个。
有没有办法通过使用另一个 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
如果行具有相同的组 ID 和日期,并且如果行中的任务之一是 "First Task",则仅显示任务为 "First Task" 的行。
如果行具有相同的组 ID 和日期,但没有行的任务为 "First Task",则显示所有行。
您可以使用 row_number function to set task position per group and then just keep record with position set to 1. So in the following query, a task named "First task" will have the first position. If there is no such task, then you could let the SQL engine choose which one will be first, but this is a bad practice。因此,为此,我在这里指定了 Task 的字母顺序。
所以这意味着,'First task'是第一个,否则'another 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'.
您可以将列 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
只给定您的样本数据和规定的要求,我会这样做:
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 有多个行,其中 none 个有 "First Task" 个任务,那么将随机选择一个。