Sql 从三个标记中选择最多两个标记

Sql 从三个标记中选择最多两个标记,sql,Sql,我有一个表格,其中包含一门学科三次考试的分数,每个分数在不同的列中,如何从三列中选择最好的两个分数?这将是可怕的-试试: select case when mark1 >= mark2 and mark1 >= mark3 then mark1 when mark2 >= mark1 and mark2 >= mark3 then mark2 else mark3 end as first, case when

我有一个表格,其中包含一门学科三次考试的分数,每个分数在不同的列中,如何从三列中选择最好的两个分数?

这将是可怕的-试试:

select case when mark1 >= mark2 and mark1 >= mark3 then mark1
            when mark2 >= mark1 and mark2 >= mark3 then mark2
            else mark3 end as first,
       case when mark1 >= mark2 and mark1 <= mark3 then mark1
            when mark1 >= mark3 and mark1 >= mark2 then mark1
            when mark2 >= mark1 and mark1 >= mark3 then mark2
            when mark2 >= mark3 and mark1 >= mark1 then mark2
            else mark3 end as second
from my_table;

这将教会您在将来将每个标记存储在单独的一行中-

这将是可怕的-试试:

select case when mark1 >= mark2 and mark1 >= mark3 then mark1
            when mark2 >= mark1 and mark2 >= mark3 then mark2
            else mark3 end as first,
       case when mark1 >= mark2 and mark1 <= mark3 then mark1
            when mark1 >= mark3 and mark1 >= mark2 then mark1
            when mark2 >= mark1 and mark1 >= mark3 then mark2
            when mark2 >= mark3 and mark1 >= mark1 then mark2
            else mark3 end as second
from my_table;

这将教会您在将来将每个标记存储在单独的一行中-

首先,您应该真正规范化表。其次,有一种简单的方法可以规范化单个查询:CTE

BEGIN;

CREATE SCHEMA sogrades;
SET search_path TO sogrades;

CREATE DOMAIN grade AS
INT
CHECK (VALUE BETWEEN 1 AND 5)
;

CREATE TABLE grades (
  student INT NOT NULL PRIMARY KEY
, grade1 GRADE
, grade2 GRADE
, grade3 GRADE
);

INSERT INTO grades (student, grade1, grade2, grade3)
VALUES
  (10, 1, 3, 5)
, (20, 4, 3, 2)
, (30, 1, 2, 1)
;

WITH g (student, grade) AS (
  SELECT student, grade1 FROM grades UNION
  SELECT student, grade2 FROM grades UNION
  SELECT student, grade3 FROM grades
)
SELECT DISTINCT gl.student, gl.grade
FROM g gl, g gr 
WHERE gl.student = gr.student
  AND gl.grade < gr.grade
ORDER BY student, grade;

ROLLBACK;

首先,您应该真正规范化表。其次,有一种简单的方法可以规范化单个查询:CTE

BEGIN;

CREATE SCHEMA sogrades;
SET search_path TO sogrades;

CREATE DOMAIN grade AS
INT
CHECK (VALUE BETWEEN 1 AND 5)
;

CREATE TABLE grades (
  student INT NOT NULL PRIMARY KEY
, grade1 GRADE
, grade2 GRADE
, grade3 GRADE
);

INSERT INTO grades (student, grade1, grade2, grade3)
VALUES
  (10, 1, 3, 5)
, (20, 4, 3, 2)
, (30, 1, 2, 1)
;

WITH g (student, grade) AS (
  SELECT student, grade1 FROM grades UNION
  SELECT student, grade2 FROM grades UNION
  SELECT student, grade3 FROM grades
)
SELECT DISTINCT gl.student, gl.grade
FROM g gl, g gr 
WHERE gl.student = gr.student
  AND gl.grade < gr.grade
ORDER BY student, grade;

ROLLBACK;

听起来好像您的表没有正常化。你会发现查询一个像:student\u id,example\u id,mark这样的表比查询一个像student\u id,mark1,mark2,mark3这样的表更容易。听起来你的表好像没有标准化。你会发现查询一个像:student\u id,example\u id,mark这样的表比查询一个像student\u id,mark1,mark2,mark3这样的表更容易