类似的问题已被多次询问,但没有一个答案有助于这种情况,所以再次提出问题
我有一个包含以下结构的表(是的,这里没有唯一的键):
---------------------------------------------------------------
|a_number | a_status | b_status | ref_id | timepublished |
|(text) | (text) | (text) |(text) | (datetime) |
---------------------------------------------------------------
|1 | U | U | re1 | 2016-08-12 13:24:25 |
|1 | P | U | re1 | 2016-08-12 13:24:35 |
|1 | P | P | re1 | 2016-08-12 13:24:45 |
|2 | U | U | re2 | 2016-08-12 12:24:30 |
|2 | U | F | re1 | 2016-08-12 12:24:45 |
|4 | U | U | re3 | 2016-08-12 13:24:30 |
|4 | U | U | re4 | 2016-08-13 15:24:30 |
---------------------------------------------------------------
现在我要解决的问题是获取每个a_number的最新状态。所以CORRECT输出应该是:
---------------------------------------------------------------
|1 | P | P | re1 | 2016-08-12 13:24:45 |
|2 | U | F | re1 | 2016-08-12 12:24:45 |
|4 | U | U | re3 | 2016-08-12 13:24:30 |
|4 | U | U | re4 | 2016-08-13 15:24:30 |
---------------------------------------------------------------
我的查询是:
SELECT af.a_number
, af.a_status
, af.b_status
, af.ref_id
, af.timepublished
FROM af_biz af
JOIN
(SELECT MAX(timepublished) timepublished, ref_id
FROM af_biz GROUP BY ref_id) tmp
ON tmp.timepublished = af.timepublished AND tmp.ref_id = af.ref_id
ORDER BY af.a_number;
但是我得到的结果包含不正确的输出(注意时间是最大时间发布但状态不同):
---------------------------------------------------------------
|1 | P | U | re1 | 2016-08-12 13:24:45 |
|1 | P | P | re1 | 2016-08-12 13:24:45 |
|2 | U | U | re2 | 2016-08-12 12:24:45 |
|2 | U | F | re1 | 2016-08-12 12:24:45 |
|4 | U | U | re3 | 2016-08-12 13:24:30 |
|4 | U | U | re4 | 2016-08-13 15:24:30 |
---------------------------------------------------------------
任何人都知道我的查询有什么问题吗?
答案 0 :(得分:1)
请试一试:
SELECT
af.a_number
, af.a_status
, af.b_status
, af.ref_id
, af.timepublished
FROM af_biz af
INNER JOIN
(
SELECT
a_number,
MAX(timepublished) max_timepublished
FROM af_biz
GROUP BY a_number
) AS t
ON af.a_number = t.a_number AND af.timepublished = t.max_timepublished
ORDER BY af.a_number
首先您需要按a_number
进行分组。 (因为您需要每个a_number
的结果)
第二次以后需要加入匹配timepublished
和a_number
(不是ref_id
)
答案 1 :(得分:1)
老式,但我使用了子查询
这是:
select
testtable.a_number
,testtable.a_status
,testtable.b_status
,testtable.timepublished
from testtable
inner join
( select
a_number
,max(timepublished) as date
from
testtable
group by
a_number ) as anumberWithMaxDate
on
testtable.a_number = anumberWithMaxDate.a_number and
testtable.timepublished = anumberWithMaxDate.date
答案 2 :(得分:0)
SELECT af.a_number, af.a_status, af.b_status, af.ref_id, af.timepublished
FROM af_biz af
JOIN
(
SELECT MAX(timepublished) timepublished,
afb.a_number+ afb.a_status+ afb.b_status+ afb.ref_id as key
FROM af_biz afb
GROUP BY afb.a_number+ afb.a_status+ afb.b_status+ afb.ref_id
) tmp
ON tmp.timepublished = af.timepublished
AND tmp.key = (af.a_number+ af.a_status+ af.b_status+ af.ref_id)
ORDER BY af.a_number;
答案 3 :(得分:0)
您的查询表达了与您想要的不同的内容。显然你对加入有一些误解。要解释您当前的查询:
您生成表单的中间表(refid,maxtimepublished),并且对于每个refid,您只有一个条目。这是您在加入中的正确表格。连接将匹配每个左行(原始表)与每个右行,匹配连接条件。
现在,refid=1
的最长时间为2016-08-12 12:24:45
,因此左表(原始)与refid=1
和timepublished='2016-08-12 12:24:45'
的每一行都将以结果结束。这是第三和第五行。
重复refid=2
,第四行也将输出。使用refid=3
,最后一行将是输出。
这些是4行,与您声称的输出不匹配。但那可能只是一个错误。
我认为你必须对你的数据做一些假设。例如:
对于每个
a_number
,任何给定时间最多只能有一个条目(独立于ref_id
)
在这种情况下,您可以使用ref_id
替换查询中的每个a_number
并完成它。 (这也是1000111和Abhijit Chowdhury的回答)
答案 4 :(得分:0)
select
A_NUMBER,A_STATUS,B_STATUS,REF_ID,TIMEPUBLISHED
from
TABL
where
TIMEPUBLISHED in (select
b.TIMEPUBLISHED
from
(select
A_NUMBER,max(TIMEPUBLISHED) as TIMEPUBLISHED
from TABL
group by A_NUMBER) b )
;