我有一个类似此示例的列表:
abc,efg,rty
和包含以下数据的表:
1 abcd
2 efgh
3 abcd
4 rtyu
5 efgh
现在我要查找表中以列表项开头的第一行。我的预期结果是:
1 abcd
2 efgh
4 rtyu
答案 0 :(得分:2)
这是完成任务的完整脚本
Declare @v_List Table
(
Text nvarchar(100)
)
Declare @v_Data Table
(
Number int,
Text nvarchar(100)
)
Insert Into @v_List values(N'abc')
Insert Into @v_List values(N'efg')
Insert Into @v_List values(N'rty')
Insert Into @v_Data values(1, N'abcd')
Insert Into @v_Data values(2, N'efgh')
Insert Into @v_Data values(3, N'abcd')
Insert Into @v_Data values(4, N'rtyu')
Insert Into @v_Data values(5, N'efgh')
;with CTE as
(
Select D.Number,
D.Text,
ROW_NUMBER() OVER (PARTITION BY L.Text Order By D.Number) as Row_No
From @v_Data D
Join @v_List L
On D.Text like L.Text + '%'
)
Select CTE.Number,
CTE.Text
From CTE
Where CTE.Row_No = 1
答案 1 :(得分:1)
select * from TableName
where Id in
(
select min(Id) from
(
select Id,
case
when Val like 'abc%' then 1
when Val like 'efg%' then 2
when Val like 'rty%' then 3
else 0 end temp
from TableName
)t where temp > 0
group by temp
)
答案 2 :(得分:0)
您可以使用带窗口的ROW_NUMBER
通过每个不同的值生成一个序列号,然后仅显示第一个。
;WITH RowNumbersByValue AS
(
SELECT
T.ID,
T.Value,
RowNumber = ROW_NUMBER() OVER (PARTITION BY T.Value ORDER BY T.ID)
FROM
YourTable AS T
)
SELECT
R.ID,
R.Value
FROM
RowNumbersByValue AS R
WHERE
R.Value IN ('abcd', 'efgh', 'rtyu') AND
R.RowNumber = 1
答案 3 :(得分:0)
对于SQL Server,我更喜欢此版本,该版本不需要子查询:
SELECT TOP 1 WITH TIES ID, Value
FROM yourTable
WHERE Value LIKE 'abc%' OR Value LIKE 'efg%' OR Value LIKE 'rty%'
ORDER BY ROW_NUMBER() OVER (PARTITION BY Value ORDER BY ID);
答案 4 :(得分:0)
您可能会使用它,有很多方法可以实现此目的,请使用更适合您的方法。
使用subquery
select id, col from
(select Row_number() over (partition by col order by id) as slno, id, col from yourtable)
as tb where tb.slno=1
使用cte
; with cte as (
select row_number() over (partition by col order by id) as Slno, id, col from table)
select id, col from cte where slno=1
使用min
select Min(id) , col from table group by col
在上述任何查询的结尾,您都可以根据需要应用where子句来过滤记录。
答案 5 :(得分:0)
SELECT * INTO #temp FROM (VALUES
(1 ,'abcd'),
(2 ,'efgh'),
(3 ,'abcd'),
(4 ,'rtyu'),
(5 ,'efgh'))a([id], [name])
您可以使用分钟和按功能分组
SELECT MIN(id), name FROM #temp GROUP BY name