2

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

label_id, scan_type, scan_cost

还有一些看起来像这样的行:

001, A40, 70
001, A40, 70
002, A40, 85
003, A40, 85
003, A40, 85

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

001, A40, 70
001, A40, 0
002, A40, 85
003, A40, 85
003, A40, 0

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

如果这label_id改变了任何东西,则它们不是顺序的。

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

4

1 回答 1

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

该解决方案背后的想法是按对数据进行分区label_id,并使用ROW_NUMBER函数来决定要保留哪些数据。

scan_typeORDER BY子句中使用了,这并不理想。如果您的实际表中有一个数据列更适合确定第一行的数据,例如时间戳列,您应该改用该其他列。外部的第二列order by需要与内部的列相同order by

这是sqlfiddle上此查询的链接。

于 2012-10-14T04:36:22.517 回答