我想将行限制为"唯一日期值"。等于某个值。这意味着我要获取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";要建立日期/时间范围,在本网站或其他地方有许多这样做的例子。