如何在字段为text数据类型时选择最大值

时间:2016-04-29 12:28:57

标签: sql sql-server

我有一个表格,其数据如下所示。 “尝试”列包含文本条目,如“第一”,“第二”,“第三”和“第四”

entryid User  Attempt
1       1     First
2       1     Second
1       2     First
2       2     Second
3       2     Fourth
4       2     First

我需要的输出如下

UsrID   Attempt
1       Second
2       Fourth

正如您在用户2的情况下所看到的,即使用户的最新条目是“第一”,因为他有一个“第四”条目,我们需要输出第四个。我们怎样才能实现它?

目前,我正在使用四个查询来检查用户是否使用EXISTS&不存在。然后我使用UNION加入他们的结果。我还在考虑使用CASE WHEN为这些状态分配一个数字,然后将该新字段的最大值分配给该字段。有人会有更好的解决方案吗?

7 个答案:

答案 0 :(得分:3)

我认为你不能。

将整数外键存储到表中:

UsrID   FkAttemptId
1       2
2       4

并使用join创建另一个表:

AttemptId   AttemptTitle
1           First
2           Second
3           Third
4           Fourth

有了这个,你可以做很多可能,比如添加描述或其他语言......

AttemptId   AttemptTitle   AttemptDescription   AttemptFR    ...
1           First          Bla bla...           Premier
2           Second         Bli bli...           Second
3           Third          ...
4           Fourth

答案 1 :(得分:3)

使用$this->Model->save($this->request->data[0])ROW_NUMBER表达式对您的记录进行排名:

CASE

答案 2 :(得分:1)

您可以使用casejoin

在查询中指定值来执行此操作
select t.*
from (select t.*,
             row_number() over (partition by user order by n.num desc) as seqnum
      from t join
           (values ('First', 1), ('Second', 2), ('Third', 3), ('Fourth', 4)
           ) n(val, num)
           on t.attempt = n.val
     ) t
where seqnum = 1;

我同意其他评论,使用参考表对数据进行规范化更有意义。但有时候,我们会遇到特定格式的数据,并且必须处理这些问题。这个答案解决了这种情况。

答案 3 :(得分:0)

你必须建立一个像这样的表

TAB_ATTEMPTS

N Attempt
1 first
2 second
3 third
4 fourth 

然后你必须加入你在加入列尝试的两个表的那个表

Select X.USER_ID,T.ATTEMPT from (
  Select  MYTABLE.USER_ID,MAX(TAB_ATTEMPTS.N) AS POSITION FROM 
  MYTABLE (NOLOCK) 
  JOIN
  TAB_ATTEMPTS (NOLOCK) ON MYTABLE.ATTEMPT=TAB_ATTEMPTS.ATTEMPT
  GROUP BY  MYTABLE.USER_ID
) as X
JOIN TAB_ATTEMPTS T ON X.POSITION=T.N

那应该做的工作。

答案 4 :(得分:0)

我会创建一个带有“NumericAttempt”列的视图,然后查询该列上的视图。


CREATE VIEW [viewOutput]
AS
SELECT 
entryid,
User,
Attempt,
CASE Attempt
  WHEN 'Fisrt'  THEN 1
  WHEN 'Second' THEN 2
  WHEN 'Third'  THEN 3
  WHEN 'Fourth' THEN 4
  WHEN 'Fifth'  THEN 5
  ELSE 999
END as AttemptNumeric
FROM  TableName

答案 5 :(得分:0)

或者......如果你没有第二次加入......

Select X.USER_ID, 
       X.POSITION, 
       (select T.ATTEMPS FROM TAB_ATTEMPTS T where T.N=X.POSITION) AS ATTEMPT 
FROM 
(Select MYTABLE.USER_ID,MAX(TAB_ATTEMPTS.N) AS POSITION 
FROM 
MYTABLE (NOLOCK) 
JOIN 
TAB_ATTEMPTS (NOLOCK) ON MYTABLE.ATTEMPT=TAB_ATTEMPTS.ATTEMPT 
GROUP BY MYTABLE.USER_ID ) as X

答案 6 :(得分:0)

另一种方法:

SELECT a.UsrID, a.Attempt
FROM (SELECT * FROM tattempt a
      JOIN (SELECT 1 AS id, 'First' AS value FROM dual
            UNION
            SELECT 2, 'Second' FROM dual
            UNION
            SELECT 3, 'Third' FROM dual
            UNION
            SELECT 4, 'Fourth' FROM dual) v
            ON (a.Attempt = v.value)
       ORDER BY v.id DESC) a
GROUP BY a.UsrID;

其中tattempt是您的表名。