繁体   English   中英

SQL:选择唯一的行

[英]SQL: selecting unique rows

select
    id,
    attempt,
    question,
    att_number,
    answer,
    timestamp,
    event
from
    mytable

在MSSQL 2008 R2中给了我以下输出:

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,答案和事件列选择唯一的行,而时间戳列的值是LOWEST?

我要这个:

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

您可以使用排名功能

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

如果您希望每组的时间戳都最低的所有记录, Row_NumberDense_Rank替换Dense_Rank

您必须使用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

您需要将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中的示例结果是相同的att_number从原来的SELECT语句。

SQLFiddle在这里

分享并享受。

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
)

使用不同的和按语句排序。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM