从第一个和第二个最新期间日期的同一列中选择多个值

时间:2016-03-24 03:39:19

标签: sql-server database

我正在尝试从同一列中获取 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 | 

我只是无法将头缠在此处,仍然坚持显示输出。非常感谢帮助。

1 个答案:

答案 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个单独的日期列。