【问题标题】:Partition a dataset by multiple conditions TSQL通过多个条件 SQL 对数据集进行分区
【发布时间】:2015-06-04 12:33:36
【问题描述】:

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

说起来,不简单GROUP BY或者ORDER BY首先得说。

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

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

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

以上是一个简单的示例架构,其中可以是少数学生的数学成绩和所有平均成绩。

我需要根据以下条件过滤掉这个集合。

  1. 获得75 > Mathsmarks > 50 的人应该排在首位
  2. 数学分数 > 90 的人应该是下一组
  3. 平均 > 65 的人应该在此之后参加
  4. 老年人年龄> 55应该是最后一组

是的,显然排名和过滤是一种选择,但我们可以在优化查询中做到这一点吗?

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

那么这只是一个问题或通过RANK过滤数据顺序。小菜一碟 !

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

谢谢

【问题讨论】:

  • 您的数据从何而来?

标签: sql-server tsql rank


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2022-06-18
    • 2021-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-11
    • 2016-09-27
    • 2015-03-09
    • 2016-02-12
    相关资源
    最近更新 更多