SQL 中 table 的第一次和第二次约会
First and second date from table in SQL
在 SQL 中,我试图从 table 中提取第一个和第二个日期。我正在使用下面的查询,它是根据我在这里阅读的关于同一主题的许多帖子制定的,即提取第二个日期等。但出于某种原因,它没有给我正确的答案,我不明白为什么。
table 称为 motif_segmentvalue
,它有一个名为 EntryDate
的列,我有兴趣用它来提取日期。我为特定用户 5407
写了一个小查询,看看我是否得到了正确的结果。
select sv2.UserId, sv2.EntryDate, min(sv2.EntryDate)
from motif_segmentvalue sv2
where sv2.EntryDate > (select MIN(sv3.EntryDate) from motif_segmentvalue sv3)
and sv2.UserId = "5407"
我得到的输出是:
UserId EntryDate min(sv2.EntryDate)
5407 2016-01-20 12:50:00 2016-01-20 12:50:00
根据我的数据,这是不正确的,"EntryDate" 列应该有与 min(sv2.EntryDate) 不同的日期 - 它应该有第二个日期。但出于某种原因,它没有。我不明白我做错了什么。任何人都可以提供有关我可能做错了什么的提示吗?我是否错误地认为 "EntryDate" 是第二次约会?
我也试过许多其他用户,两列都给出了相同的日期。
谢谢
试试这个:
SELECT * FROM motif_segmentvalue sv2
WHERE sv2.UserId = "5407"
ORDER BY EntryDate ASC
LIMIT 2
如果我理解正确,我将通过几个步骤构建该查询。
首先求绝对最小值
select UserId, min(EntryDate)
from motif_segmentvalue
where UserId = "5407"
group by UserId
然后获取下一个最小值(使用上面的查询)
select UserId, min(EntryDate)
from motif_segmentvalue
where UserId = "5407" and
EntryDate > (
select UserId, min(EntryDate)
from motif_segmentvalue
where UserId = "5407"
group by UserId
)
group by UserId
终于加入了两个
select t1.UserId, t1.min_1, t2.min_2
from (
select UserId, min(EntryDate) as min_1
from motif_segmentvalue
where UserId = "5407"
group by UserId
) t1
join (
select UserId, min(EntryDate) as min_2
from motif_segmentvalue
where UserId = "5407" and
EntryDate > (
select UserId, min(EntryDate)
from motif_segmentvalue
where UserId = "5407"
group by UserId
)
group by UserId
) t2
on t1.UserId = t2.UserId
我想这会让你得到你想要的。
它有一个 2050-01-01 日期作为没有第二个日期的备份
select sv2.UserId, min(sv2.EntryDate) as first
, min(if(sv2.EntryDate=mindate,'2050-01-01', sv2.EntryDate)) as second
from motif_segmentvalue sv2
join (
select sv3.UserId, min(sv3.EntryDate) as mindate
FROM motif_segmentvalue sv3
WHERE sv3.UserId = "5407"
) as temp ON temp.UserId = sv2.UserId
WHERE sv2.UserId = "5407"
更新:
这将获取第二个日期,而不是下一个日期时间。
select sv2.UserId, min(sv2.EntryDate) as first
, min(if(date(sv2.EntryDate)=mindate,'2050-01-01', sv2.EntryDate)) as second
from motif_segmentvalue sv2
join (
select sv3.UserId, min(date(sv3.EntryDate)) as mindate
FROM motif_segmentvalue sv3
WHERE sv3.UserId = "5407"
) as temp ON temp.UserId = sv2.UserId
WHERE sv2.UserId = "5407"
在 SQL 中,我试图从 table 中提取第一个和第二个日期。我正在使用下面的查询,它是根据我在这里阅读的关于同一主题的许多帖子制定的,即提取第二个日期等。但出于某种原因,它没有给我正确的答案,我不明白为什么。
table 称为 motif_segmentvalue
,它有一个名为 EntryDate
的列,我有兴趣用它来提取日期。我为特定用户 5407
写了一个小查询,看看我是否得到了正确的结果。
select sv2.UserId, sv2.EntryDate, min(sv2.EntryDate)
from motif_segmentvalue sv2
where sv2.EntryDate > (select MIN(sv3.EntryDate) from motif_segmentvalue sv3)
and sv2.UserId = "5407"
我得到的输出是:
UserId EntryDate min(sv2.EntryDate)
5407 2016-01-20 12:50:00 2016-01-20 12:50:00
根据我的数据,这是不正确的,"EntryDate" 列应该有与 min(sv2.EntryDate) 不同的日期 - 它应该有第二个日期。但出于某种原因,它没有。我不明白我做错了什么。任何人都可以提供有关我可能做错了什么的提示吗?我是否错误地认为 "EntryDate" 是第二次约会?
我也试过许多其他用户,两列都给出了相同的日期。
谢谢
试试这个:
SELECT * FROM motif_segmentvalue sv2
WHERE sv2.UserId = "5407"
ORDER BY EntryDate ASC
LIMIT 2
如果我理解正确,我将通过几个步骤构建该查询。
首先求绝对最小值
select UserId, min(EntryDate)
from motif_segmentvalue
where UserId = "5407"
group by UserId
然后获取下一个最小值(使用上面的查询)
select UserId, min(EntryDate)
from motif_segmentvalue
where UserId = "5407" and
EntryDate > (
select UserId, min(EntryDate)
from motif_segmentvalue
where UserId = "5407"
group by UserId
)
group by UserId
终于加入了两个
select t1.UserId, t1.min_1, t2.min_2
from (
select UserId, min(EntryDate) as min_1
from motif_segmentvalue
where UserId = "5407"
group by UserId
) t1
join (
select UserId, min(EntryDate) as min_2
from motif_segmentvalue
where UserId = "5407" and
EntryDate > (
select UserId, min(EntryDate)
from motif_segmentvalue
where UserId = "5407"
group by UserId
)
group by UserId
) t2
on t1.UserId = t2.UserId
我想这会让你得到你想要的。
它有一个 2050-01-01 日期作为没有第二个日期的备份
select sv2.UserId, min(sv2.EntryDate) as first
, min(if(sv2.EntryDate=mindate,'2050-01-01', sv2.EntryDate)) as second
from motif_segmentvalue sv2
join (
select sv3.UserId, min(sv3.EntryDate) as mindate
FROM motif_segmentvalue sv3
WHERE sv3.UserId = "5407"
) as temp ON temp.UserId = sv2.UserId
WHERE sv2.UserId = "5407"
更新: 这将获取第二个日期,而不是下一个日期时间。
select sv2.UserId, min(sv2.EntryDate) as first
, min(if(date(sv2.EntryDate)=mindate,'2050-01-01', sv2.EntryDate)) as second
from motif_segmentvalue sv2
join (
select sv3.UserId, min(date(sv3.EntryDate)) as mindate
FROM motif_segmentvalue sv3
WHERE sv3.UserId = "5407"
) as temp ON temp.UserId = sv2.UserId
WHERE sv2.UserId = "5407"