如何使同一项目的多次出现与第一次出现的值不同?

Eri*_*ond 2 sql t-sql sql-server-2008

我有一个看起来像这样的数据库:

label_id, scan_type, scan_cost
Run Code Online (Sandbox Code Playgroud)

有些行看起来像这样:

001, A40, 70
001, A40, 70
002, A40, 85
003, A40, 85
003, A40, 85
Run Code Online (Sandbox Code Playgroud)

我需要生成一个如下所示的结果集:

001, A40, 70
001, A40, 0
002, A40, 85
003, A40, 85
003, A40, 0
Run Code Online (Sandbox Code Playgroud)

也就是说,任何多次出现都需要label_idscan_cost列设置为0,但每个label_id值的第一次出现需要保持不变.

label_id如果改变任何东西,则不是顺序的.

是否有可能在SQL中实现此行为?请注意,SQL方言是T-SQL,Microsoft SQL Server 2008

das*_*ght 6

此查询返回您要查找的内容:

SELECT
    label_id
,   scan_type
,   CASE WHEN row_number() OVER (PARTITION BY label_id ORDER BY scan_type)=1
        THEN scan_cost
        ELSE 0
    END
FROM test
ORDER BY label_id, scan_type
Run Code Online (Sandbox Code Playgroud)

这个解决方案背后的想法是通过分区数据label_id,并使用ROW_NUMBER函数来决定保留哪些数据.

scan_typeORDER BY子条款中使用,这是不理想的.如果您的实际表中有一列其中的数据更适合确定哪一行(例如时间戳列),则应使用该其他列.外部的第二列order by需要与内部的列相同order by.

这是sqlfiddle上此查询的链接.