选择表中列表项的首次出现

时间:2019-08-27 06:34:12

标签: sql sql-server tsql

我有一个类似此示例的列表:

abc,efg,rty

和包含以下数据的表:

1 abcd
2 efgh
3 abcd
4 rtyu
5 efgh

现在我要查找表中以列表项开头的第一行。我的预期结果是:

1 abcd
2 efgh
4 rtyu 

6 个答案:

答案 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
相关问题