获取行,使唯一的"日期"值等于某个值



我想将行限制为"唯一日期值"。等于某个值。这意味着我要获取7天的数据。

例如,data为

1  1/2/2022  9:30  
2  1/2/2022  9:30  
3  2/2/2022  9:30  
4  3/2/2022  9:30  
5  4/2/2022  9:30

这里我想获取最多3天的数据

所以期望输出是

1  1/2/2022  9:30  
2  1/2/2022  9:30  
3  2/2/2022  9:30  
4  3/2/2022  9:30  

对于这样的条件限制,有什么可能的查询语法吗?

使用dense_rank

select id,date_col
from (
select *, dense_rank() over(order by date_col) r
from (
values
(1, cast('2022-02-01 09:30' as datetime))
, (2, '2022-02-01 09:30')
, (3, '2022-02-02 09:30')
, (4, '2022-02-03 09:30')
, (5, '2022-02-04 09:30')
) d (id,date_col)
) t
where r <= 3

where子句通常用来过滤行,例如:

select
*
from (
values
(1, cast('2022-02-01 09:30' as datetime))
, (2, '2022-02-01 09:30')
, (3, '2022-02-02 09:30')
, (4, '2022-02-03 09:30')
, (5, '2022-02-04 09:30')
) d (id,date_col)
WHERE DATE_COL IN ('2022-02-01 09:30', '2022-02-02 09:30','2022-02-03 09:30' )

检测项目

id | date_col               
-: | :----------------------
1 | 2022-02-01 09:30:00.000
2 | 2022-02-01 09:30:00.000
3 | 2022-02-02 09:30:00.000
4 | 2022-02-03 09:30:00.000

db<此处小提琴>

谓词中使用的语法需要适合所讨论的列的数据类型。

要确保您的输出将显示所需的日期/时间范围,即使它们不存在于数据中,您首先需要创建这些值,然后将数据连接到这些值(通常是左外连接)。例如

;with CTE as (
select
id, date_col
from (
values
(1, cast('2022-02-01 09:30' as datetime))
, (2, '2022-02-01 09:30')
, (3, '2022-02-02 09:30')
, (4, '2022-02-03 09:30')
, (5, '2022-02-04 09:30')
) AS d (id,date_col)
)
select 
CTE.ID
, CTE.date_col
, coalesce(t.some_col_here,'some value') as some_alias
from CTE
left join your_data as t on CTE.date_col = t.date_col
and t.other_col = 'something'
-- where (t.extra_col = 1 or t.extra_col IS NULL) 

在本例中,您不需要为日期/时间值使用where子句(因为这些值现在受到您提供的CTE内容的限制),相反,您可能需要使用左连接条件来限制结果中包含的数据。请注意,如果使用where子句,则不会从CTE中抑制需要的行。

还请注意,您可以使用"递归cte";要建立日期/时间范围,在本网站或其他地方有许多这样做的例子。

相关内容

最新更新