首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >SELECT MAX CASE问题

SELECT MAX CASE问题
EN

Stack Overflow用户
提问于 2019-06-28 01:29:32
回答 3查看 51关注 0票数 0

在我的数据库中,我有影响它们的操作和里程碑。我需要计算一个操作里程碑类型的值,它是一个文本字段,然后根据该值获得最大值及其id。为了简化起见,假设operation.id =1。

在里程碑表中,我有

代码语言:javascript
运行
复制
id | type   | operation_id
1  | 'Ori'  | 1
2  | 'Lib'  | 1
3  | 'Desc' | 1

我试过了:

代码语言:javascript
运行
复制
SELECT m.id,
MAX(CASE
    WHEN m.type = 'Ori'   THEN 0
    WHEN m.type = 'Trans' THEN 1
    WHEN m.type = 'Arriv' THEN 2
    WHEN m.type = 'Ofic'  THEN 3
    WHEN m.type = 'Lib'   THEN 4
    WHEN m.type = 'Ret'   THEN 5
    WHEN m.type = 'Desc'  THEN 6
    WHEN m.type = 'Dev'   THEN 7
END) val
FROM milestone m WHERE m.operation_id = 1

我期望得到的是:

代码语言:javascript
运行
复制
id | val
3  | 6

我得到的是:

代码语言:javascript
运行
复制
id | val
1  | 6

如果我添加到查询中: GROUP BY m.id

我得到了:

代码语言:javascript
运行
复制
id | val
1  | 0
2  | 4
3  | 6

我知道我可以通过val来排序,然后将结果限制为1,但这不是我想要的。

EN

回答 3

Stack Overflow用户

发布于 2019-06-28 01:31:50

您可以使用:

代码语言:javascript
运行
复制
SELECT *
FROM milestone m 
WHERE m.operation_id = 1
ORDER BY 
  (CASE
    WHEN m.type = 'Ori'   THEN 0
    WHEN m.type = 'Trans' THEN 1
    WHEN m.type = 'Arriv' THEN 2
    WHEN m.type = 'Ofic'  THEN 3
    WHEN m.type = 'Lib'   THEN 4
    WHEN m.type = 'Ret'   THEN 5
    WHEN m.type = 'Desc'  THEN 6
    WHEN m.type = 'Dev'   THEN 7
  END) DESC
LIMIT 1
票数 0
EN

Stack Overflow用户

发布于 2019-06-28 01:51:35

我更喜欢将type和它的value保存在一个单独的表(TypeValue)或临时表中,这样就可以很容易地与里程碑表连接以获得预期的结果:

代码语言:javascript
运行
复制
CREATE TABLE milestone (id integer, `type` varchar (5), operation_id integer);

INSERT INTO milestone (id, `type`, operation_id) VALUES
(1, 'Ori', 1),
(2, 'Lib', 1),
(3, 'Desc', 1);

CREATE TABLE TypeValue (`type` varchar (5), value integer);

INSERT INTO TypeValue ( `type`, value) VALUES
('Ori'  , 0),
('Trans', 1),
('Arriv', 2),
('Ofic' , 3),
('Lib'  , 4),
('Ret'  , 5),
('Desc' , 6),
('Dev'  , 7);

工作查询为:

代码语言:javascript
运行
复制
SELECT m.id, t.value
FROM milestone m 
JOIN TypeValue t on t.`type` = m.`type`
WHERE m.operation_id = 1
ORDER BY t.value DESC
LIMIT 1;

结果:

代码语言:javascript
运行
复制
id  | value 
------------
3   | 6
票数 0
EN

Stack Overflow用户

发布于 2019-06-28 02:29:32

要在不创建单独的表、使用LIMIT或排序的情况下完成此操作,可以使用内联表(表子查询)。

老实说,您最好像Arulkumar那样将值列表放在单独的表中,然后将关联的值存储在您的里程碑表中。

这是通过将每个里程碑id与其类型值作为子查询进行匹配,然后将结果与返回operation_id的总最大类型值的另一个子查询进行匹配来实现的。

代码语言:javascript
运行
复制
Select * From
(SELECT m.id, 
    CASE
        WHEN m.type = 'Ori'   THEN 0
        WHEN m.type = 'Trans' THEN 1
        WHEN m.type = 'Arriv' THEN 2
        WHEN m.type = 'Ofic'  THEN 3
        WHEN m.type = 'Lib'   THEN 4
        WHEN m.type = 'Ret'   THEN 5
        WHEN m.type = 'Desc'  THEN 6
        WHEN m.type = 'Dev'   THEN 7
    END val
FROM milestone m) inlineTable
Where val = 
(Select Max(CASE
    WHEN type = 'Ori'   THEN 0
    WHEN type = 'Trans' THEN 1
    WHEN type = 'Arriv' THEN 2
    WHEN type = 'Ofic'  THEN 3
    WHEN type = 'Lib'   THEN 4
    WHEN type = 'Ret'   THEN 5
    WHEN type = 'Desc'  THEN 6
    WHEN type = 'Dev'   THEN 7
    END) from milestone
    WHERE operation_id = 1)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56796050

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档