Sql 每天选择一行

Sql 每天选择一行,sql,sql-server,tsql,Sql,Sql Server,Tsql,尝试在下面的表中选择每天一行: ID|PageID|DateTime |Value|SiteID 1 | 1 |2021/03/06| 2001| 1 1 | 1 |2021/03/06| 2002| 1 1 | 2 |2021/03/06| 2003| 1 1 | 3 |2021/03/06| 2004| 1 1 | 4 |2021/03/06| 2004| 1 1 | 1 |2021/03/07| 2004| 1 1 | 2 |2021/03/07

尝试在下面的表中选择每天一行:

ID|PageID|DateTime  |Value|SiteID
1 |  1   |2021/03/06| 2001| 1
1 |  1   |2021/03/06| 2002| 1
1 |  2   |2021/03/06| 2003| 1
1 |  3   |2021/03/06| 2004| 1
1 |  4   |2021/03/06| 2004| 1
1 |  1   |2021/03/07| 2004| 1
1 |  2   |2021/03/07| 2005| 1
1 |  3   |2021/03/07| 2006| 1
所以这个站点有多个单独的链接,但是PageID有点多余,我试着按SiteID分组,每天按SiteID分组检索一行 只要是一天一次,价值并不特别重要

尝试:

SELECT [DateTime], [Followers], [SiteID]
FROM test
WHERE datetime IN (
    SELECT MAX(datetime)
    FROM test Where SiteID = 1
    GROUP BY datetime
); 

在提供所需输出之前,以下是一种方法:

select *
from (select * , row_number() over (partition by SiteId,Date) rn from table) tt
where tt.rn = 1

您可以使用窗口函数。但如果该值是datetime,则需要提取日期:

select *
from (select t.* ,
             row_number() over (partition by SiteId, convert(date, datetime) order by (select null)) as seqnum
      from t
     ) t
where seqnum = 1;
编辑:

如果性能是一个问题,那么相关子查询可能具有更好的性能:

select t.*
from t
where t.datetime = (select min(t2.datetime)
                    from t t2
                    where t2.siteId = t.siteId and
                          t2.date >= convert(date, t.date) and
                          t2.date < dateadd(day, 1, convert(date, t2.date))
                   );
注意:这假设datetime是唯一的。您可以使用任何唯一的列进行比较。

它可能会帮助您:

select top (1) with ties t.*
from table t
order by Row_Number() Over(Partition By SiteId,convert(date, datetime) Order by (select null))

请告诉我们您尝试从测试中选择[DateTime]、[Followers]、[SiteID],其中DateTime在测试中选择MAXdatetime,其中SiteID=1 GROUP BY DateTime;就性能而言,您认为交叉应用SELECT TOP 1方法比窗口功能更好吗?我最近也遇到过类似的情况,差别很大,但可能是具体情况造成的。@AnthonyHancock。对于一个表,在这种情况下,交叉应用不会产生任何影响。但是,相关子查询可能更快。应用将替换联接。