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_id将scan_cost列设置为0,但每个label_id值的第一次出现需要保持不变.
label_id如果改变任何东西,则不是顺序的.
是否有可能在SQL中实现此行为?请注意,SQL方言是T-SQL,Microsoft SQL Server 2008
此查询返回您要查找的内容:
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_type在ORDER BY子条款中使用,这是不理想的.如果您的实际表中有一列其中的数据更适合确定哪一行(例如时间戳列),则应使用该其他列.外部的第二列order by需要与内部的列相同order by.
这是sqlfiddle上此查询的链接.
| 归档时间: |
|
| 查看次数: |
78 次 |
| 最近记录: |