按多个条件SQL对数据集进行分区

时间:2015-03-31 08:32:16

标签: sql-server tsql rank

我有一个有趣的要求,即使用不同的条件对数据集进行分区。

说,首先我不得不说GROUP BYORDER BY

是排名吗?是的,更接近,但这里的挑战是为此写一个查询。

嗯,我仍然想知道并寻找一个直接的选择。我来介绍一个问题。

Name ----- Age ----- MarksForMaths ---- AvgByTotal 

上面是一个简单的示例模式,它可以是少数学生为数学和所有平均分数所采用的标记。

我需要根据以下标准过滤掉这个集合。

  1. 75>的人Mathsmarks> 50 应该在最上面
  2. 获得 Mathsmarks>的人90 应该是下一组
  3. average>的人65 应该在此后发生
  4. 年长者年龄> 55 应该是最后一组
  5. 是的,显然排名和过滤是一个选项,但我们可以在优化查询中进行吗?

    提示 - 我所做的基本上是创建一个额外的列名RANK,并根据条件使用索引更新列。

    然后它只是一个问题或按RANK过滤数据顺序。小菜一碟 !

    但问题是,我们可以进行一次查询吗?欣赏提示。

    由于

1 个答案:

答案 0 :(得分:0)

以下查询是否符合您的要求:

DECLARE @BaseTable TABLE (Name VARCHAR(50), Age INT, MarksForMaths INT, AvgByTotal INT)

INSERT INTO @BaseTable (Name, Age, MarksForMaths, AvgByTotal)
SELECT 'A', 1, 65, 12 UNION ALL
SELECT 'B', 1, 5, 75 UNION ALL
SELECT 'C', 1, 95, 12 UNION ALL
SELECT 'D', 65, 65, 12 UNION ALL
SELECT 'E', 65, 5, 12

SELECT tmp.Name, tmp.TmpRank
FROM
(
    SELECT 
        Name,
        CASE 
             WHEN (MarksForMaths > 50 AND MarksForMaths < 75) THEN 1
             WHEN (MarksForMaths > 90) THEN 2
             WHEN (AvgByTotal > 65) THEN 3
             WHEN (Age > 55) THEN 4
             ELSE 5 
       END AS TmpRank
    FROM @BaseTable
)   tmp
ORDER BY tmp.TmpRank