作者Schematic (小小宝的妈)
看板Database
标题Re: [SQL ] 列出一个栏位中开始变化的前後值
时间Sat Apr 30 23:08:15 2016
※ 引述《JeremyJoung (J.J.)》之铭言:
: 老实说 这个需求不算难 但是你指定的输出格式并不佳
: 大幅提升了计算难度
: 理想的输出最好是
: 同一个人在"同一行"内用多个栏位来表示UNIT的差异 而不是用"多行"显示
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^这个显示方法也是ok的
主要是找出有换单位的人,显示方式倒是其次
但若一个人不只换了一个单位
您建议的显示方式是否就不适合了呢?
: SELECT a.*
: FROM table AS a
: LEFT JOIN table b ON a.id=b.id && a.year=b.year-1 && a.unit<>b.unit
: LEFT JOIN table c ON a.id=c.id && a.year=c.year+1 && a.unit<>c.unit
: WHERE a.id IN(SELECT id FROM table GROUP BY id HAVING COUNT(DISTINCT unit) >1)
: ##先取有换单位的人
: && (b.id IS NOT NULL || c.id IS NOT NULL)
: ORDER BY a.id, a.year DESC
: 这还不是最好的算式 但是够快了 简短比较重要
: a.id IN() 是用来加速的 实际上可以完全不用
: 缺点是年份要相连 否则抓不到
: 也有年分不用相连的方法 但是又会更复杂
: ※ 引述《Schematic (小小宝的妈)》之铭言:
: : 资料库名称:SQL SERVER
: : 资料库版本:2012
: : 内容/问题描述:
: : 列出某位员工在哪一年换了单位,没有换单位的员工不用列出
: : Num id year unit
: : --------------------------
: : 1 1 99 A
: : 2 1 98 B
: : 3 1 97 B
: : 4 1 96 B
: : 1 2 99 B
: : 2 2 98 B
: : 3 2 97 B
: : 1 3 97 C
: : 2 3 96 C
: : 3 3 95 C
: : 4 3 94 B
: : 1 4 97 A
: : 2 4 96 B
: : 3 4 95 B
: : 预期结果,员工1在99年从B单位换到A单位
: : id year unit
: : -----------------------
: : 1 99 A
: : 1 98 B
: : 3 95 C
: : 3 94 B
: : 4 97 A
: : 4 96 B
: : 谢谢
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 1.34.181.197
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/Database/M.1462028896.A.669.html
1F:推 JeremyJoung: 可以的 就算是多次换单位都可以计算 05/02 19:23