【问题标题】:SQL Server mode SQLSQL Server 模式 SQL
【发布时间】:2010-01-12 06:29:29
【问题描述】:

我有一张表格,列出了每个班级学生的成绩。 我想要一个看起来像这样的结果集:

BIO...B
CHEM...C

其中“B”和“C”是类的模式。 我可以获取所有成绩的模式,但不确定如何获取每个班级的模式

【问题讨论】:

  • 如果您从统计意义上说,那不是模式。模式是最常出现的元素。在这种情况下,您的两个课程都是双模式的(A、C 代表生物,B、D 代表化学)
  • 我使用的结果集与我使用的示例表值无关
  • 那么你真的想要这个模式吗?或者,您是否在寻找示例显示的平均值或中位数(很难用两个值来判断)?
  • 我想要模式,每个类最常出现的值
  • 我使用的是 MS SQL Server,没有内置 MODE()

标签: sql tsql


【解决方案1】:

这里,在 SQL 2005/2008 上是这样的:

;WITH 
  Counts AS (
    SELECT ClassName, Grade, COUNT(*) AS GradeFreq 
    FROM Scores
    GROUP BY ClassName, Grade
    )
, Ranked AS (
    SELECT ClassName, Grade, GradeFreq
    , Ranking = DENSE_RANK() OVER (PARTITION BY ClassName ORDER BY GradeFreq DESC)
    FROM Counts
    )
SELECT * FROM Ranked WHERE Ranking = 1

或者只是:

;WITH Ranked AS (
  SELECT 
    ClassName, Grade
  , GradeFreq = COUNT(*)
  , Ranking = DENSE_RANK() OVER (PARTITION BY ClassName ORDER BY COUNT(*) DESC)
  FROM Scores
  GROUP BY ClassName, Grade
  )
SELECT * FROM Ranked WHERE Ranking = 1

【讨论】:

  • 谢谢,这样就可以了,但我正在研究如何使用 UDF
【解决方案2】:

使用 GROUP BY 子句。

SELECT className, ClassMode(className)
FROM Grades
GROUP BY className

当然必须创建您的 Mode() 函数,但它应该是一个简单的函数,例如:

CREATE FUNCTION ClassMode(@ClassName varchar(50))
RETURNS varchar(2)
AS
BEGIN
    Declare @temp varchar(2)

    SELECT @temp = TOP 1 Grade, COUNT(*) Grades as frequency
    FROM Grades
    WHERE ClassName = @ClassName
    GROUP BY ClassName
    ORDER BY frequency DESC

    RETURN @temp
END

【讨论】:

  • 功能码是不是少了什么?似乎根本没有使用@ClassName。我认为它应该将 FROM 子句更改为“FROM Grades where ClassName = @ClassName”或将 GROUP BY 子句更改为 GROUP BY ClassName HAVING ClassName = @ClassName。此外,主要的 SELECT 可以简单地从 Grades 中选择不同的 ClassName, ClassMode(ClassName)。这样,每个 ClassName 就有一种模式。还是我弄错了?
  • 感谢您对函数定义的了解 - 肯定错过了 where/have。至于不同的,你肯定可以这样做 - 我的印象是 OP 会为每个学生做这件事,所以我怀疑简单的查询无论如何都能完成他们所需要的,但你对给定的例子是正确的。
  • 我需要每个班级的模式,所以你是说我需要修改这个 UDF 以使其工作?
【解决方案3】:

你只需要GROUP BY ClassName

SELECT ClassName, MODE(Grade) FROM YourTable GROUP BY ClassName

【讨论】:

  • SQL Server 有 Mode() 函数吗?
  • 我是这个领域的新手,不知道我可以,是否容易找到放置自定义函数的位置,以便调用它的 SQL 可以找到它?
  • 什么?您不能轻松编写用户定义的聚合。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-21
  • 2011-01-17
  • 2012-12-22
  • 2011-07-21
  • 1970-01-01
相关资源
最近更新 更多