2013-07-25 90 views
2
select 
    id, 
    attempt, 
    question, 
    att_number, 
    answer, 
    timestamp, 
    event 
from 
    mytable 

给我这个输出在MSSQL 2008 R2:SQL:选择唯一行

id,attempt,question,seq_number,answer,timestamp,event 
1296040,22059,3813,0,"11960,11961,11959,11958:",1265006717,0 
1296165,22059,3813,1,"11960,11961,11959,11958:11960",1265011083,2 
1296166,22059,3813,1,"11960,11961,11959,11958:11960",1265011049,6 
1296163,22059,3813,1,"11960,11961,11959,11958:11960",1265011037,6 
1296164,22059,3813,1,"11960,11961,11959,11958:11960",1265011072,6 

如何选择只具有最低的尝试,问题,att_number,答案和事件列中的唯一行时间戳列的值?

我想这一点:

id,attempt,question,seq_number,answer,timestamp,event 
1296040,22059,3813,0,"11960,11961,11959,11958:",1265006717,0 
1296165,22059,3813,1,"11960,11961,11959,11958:11960",1265011083,2 
1296163,22059,3813,1,"11960,11961,11959,11958:11960",1265011037,6 

回答

1

你必须使用group by条款。

低于select声明将适用于您的示例。

select   
    min(id), attempt,question, 
    att_number, answer, timestamp, 
    event 
from 
    mytable 
group by 
    attempt,question, 
    att_number, answer, timestamp, 
    event 

但如果你真的想要最低的时间戳,你必须删除id列形式select如下

select   
    attempt,question, 
    att_number, answer, min(timestamp), 
    event 
from 
    mytable 
group by 
    attempt,question, 
    att_number, answer, 
    event 
+0

不回答问题 - >'与最低值的时间戳列' –

+0

@MitchWheat我编辑了答案,谢谢! – Parado

+0

可能只能巧合工作,如果id是身份... –

-1

使用不同和ORDER BY语句。

+0

这不会提供问题的答案。要批评或要求作者澄清,在他们的帖子下留下评论 - 您可以随时评论在你自己的帖子上,一旦你有足够的[声誉](http://stackoverflow.com/help/whats-reputation),你将能够[评论任何帖子](http://stackoverflow.com/help/特权/评论) – Shai

+1

@Shai您的评论是错误的。这是一个值得推荐的,但是为了让它成为_real answer_,我会建议ac提供SQL,而不是简单地提供课程。 – DonBoitnott

1

你需要使用GROUP BY与MIN:

select MIN(id), 
     attempt, 
     question, 
     seq_number, 
     answer, 
     MIN(timestamp), 
     event 
    from mytable 
    GROUP BY ATTEMPT, QUESTION, SEQ_NUMBER, ANSWER, EVENT 

这不是显而易见的问题,但OP希望双方MIN(ID)和MIN(TIMESTAMP)。还要注意,示例结果中的列名与OP的SQL中的不同。我选择接受示例结果中的seq_number与原始SELECT语句中的att_number相同。

SQLFiddle here

分享和享受。

1
select 
id, 
attempt, 
question, 
att_number, 
answer, 
timestamp, 
event 
from 
mytable m 
where m.timestamp=(
    select min(timestamp) 
    from mytable mi 
    where mi.attempt=m.attempt and mi.question=m.question and mi.att_number=m.att_number and mi.answer=m.answer and mi.event=m.event 
) 
+0

在这个答案中使用子查询有什么缺点吗? – luisdev

2

您可以使用ranking function

with cte as(
    select id,attempt,question,att_number,answer,timestamp,event, 
      rn = Row_Number() Over (
        Partition By attempt, question, att_number, answer,event 
        Order By timestamp Asc) 
    from mytable 
) 
select select,id,attempt,question,att_number,answer,timestamp,event 
from cte 
where rn = 1 

如果你想与每组最低时间戳的所有记录与Dense_Rank取代Row_Number