我正在尝试从同一列中获取 MARK 1& GRED 1 从第二个最后一个时段中选择 MARK 2& GRED 2 来自 LATEST RANGE PEROID 。
示例..
Sam GRED 2是2014年1月1日至2014年6月30日期间
Sam MARK 2是2014年7月1日至2014年9月31日期间
下面是示例表和欲望输出。
结果表
| Name | Gred | Mark | SemPeriod |
|------|------|-------|-------------------------|
| Sam | C | 45.60 | 01.01.2013 - 30.06.2013 |
| Sam | B | 55.55 | 01.07.2013 - 31.12.2013 |
| Sam | A | 85.50 | 01.01.2014 - 30.06.2014 |
| Sam | C | 48.60 | 01.07.2014 - 31.09.2014 |
| Sean | C | 45.60 | 01.01.2014 - 30.06.2014 |
| Sean | B | 55.55 | 01.07.2014 - 31.12.2014 |
| Sean | A | 85.50 | 01.01.2015 - 30.06.2015 |
| Sean | C | 48.60 | 01.07.2015 - 31.12.2015 |
渴望输出
| Name | Gred 1| Mark 1 | Gred 2 | Mark 2 |
|------|-------|--------|--------|---------|
| Sam | A | 85.50 | C | 48.60 |
| Sean | A | 85.50 | C | 48.60 |
我只是无法将头缠在此处,仍然坚持显示输出。非常感谢帮助。
答案 0 :(得分:0)
SemPeriod的数据类型是什么?
; WITH CTE AS
(
SELECT *, RN = ROW_NUMBER() OVER (PARTITION BY Name ORDER BY SemPeriod_Start DESC)
FROM yourtable
)
SELECT Name,
Gred1 = MAX(CASE WHEN RN = 2 THEN Gred END),
Mark1 = MAX(CASE WHEN RN = 2 THEN Mark END),
Gred2 = MAX(CASE WHEN RN = 1 THEN Gred END),
Mark2 = MAX(CASE WHEN RN = 1 THEN Mark END)
FROM CTE
GROUP BY Name
如果你的SemPeriod是字符串,你应该分成两个不同的日期列。
如果没有,查询将会像
一样难看PARTITION BY Name
ORDER BY CONVERT(DATE, LEFT(SemPeriod , charindex('-', SemPeriod) - 1), 103) DESC
对于大型数据集,它会很慢。如果日期范围在SemPeriod中的格式不同或者数据中存在错误数据,查询也会中断。
为确保数据质量,最好分成2个单独的日期列。