我有一个表格,其数据如下所示。 “尝试”列包含文本条目,如“第一”,“第二”,“第三”和“第四”
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为这些状态分配一个数字,然后将该新字段的最大值分配给该字段。有人会有更好的解决方案吗?
答案 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)
您可以使用case
或join
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
是您的表名。