每天选择第一个条目

时间:2018-05-16 20:52:48

标签: sql sql-server

我的表格结构如下

temp
ID | Date
---|-----------
1  | 2018-01-01
2  | 2018-01-01
3  | 2018-01-01
4  | 2018-01-02
5  | 2018-01-02
6  | 2018-01-03

我将从用户那里获得开始和结束日期的输入:

@StartDate DATE = '2018-01-01'
@EndDate DATE = '2018-01-03'

我希望我的回报结构如下:

ID | Date
---|-----------
1  | 2018-01-01
4  | 2018-01-02
6  | 2018-01-03

我试过这样做:

select distinct temp.ID, joinTable.Date
from temp
inner join (
            select min(innerTemp.Date), innerTemp.ID
            from temp innerTemp
            where innerTemp.Date >= @StartDate
            and innerTemp.Date < @EndDate
            group by innerTemp.ID, innerTemp.Date
           ) as joinTable on joinTable.ID = temp.ID and joinTable.Date = temp.Date
where temp.Date >= @StartDate
and temp.Date < @EndDate
order by temp.Date desc

要尝试将表连接到自身,每天只有一个条目,然后从中选择,但这不起作用。我对这个很难过。有什么想法吗?

2 个答案:

答案 0 :(得分:3)

这看起来很复杂。这将返回您想要的结果集:

select min(id), date
from temp
where date >= @StartDate and date < @EndDate
group by date;

如果您要保留其他列(因此group by不合适),一个性能良好的简单方法是:

select t.*
from temp t
where t.id = (select min(t2.id) from temp t2 where t2.date = t.date and t2.date >= @StartDate and t2.date < @EndDate);

当然,您也可以使用row_number(),但在temp(date, id)temp(id)上使用索引时,上述情况应该非常快。

答案 1 :(得分:2)

select cast(cast(year as varchar(max))+'-'+cast(month as varchar(max))+'-01' as datetime)