gpt4 book ai didi

sql - 获取一组记录的最接近给定日期的日期

转载 作者:行者123 更新时间:2023-11-29 14:04:51 24 4
gpt4 key购买 nike

大家好,我遇到了一个 sql 查询问题,看,这是我的场景:

我有一个学生表和一个存储学生入学或离开学校日期的表,所以我想为每个学生获取最接近给定日期的日期,但我找不到执行此操作的方法。

Students Data:

|idstudent|name |
------------------
| 1 | John |
| 2 | Bob |
------------------

Dates Data:

|id|idstudent| date |type|
------------------------------
|1 | 1 |20-01-2015| 1 |
|2 | 2 |20-01-2015| 1 |
|3 | 2 |15-08-2015| 2 |
|4 | 1 |31-08-2015| 2 |
------------------------------

Desired Date = 01-08-2015

|idstudent| name | date |type|
-------------------------------------
| 1 | John | 31-08-2015 | 2 |
| 2 | Bob | 15-08-2015 | 2 |

学生表:

CREATE TABLE students
(
idstudent serial NOT NULL,
name character varying(200),
CONSTRAINT idstudent PRIMARY KEY (idstudent)
)
WITH (
OIDS=FALSE
);
ALTER TABLE students
OWNER TO postgres;

日期表:

CREATE TABLE students_dates
(
idstudent_date serial NOT NULL,
idstudent bigint,
date_ date,
type smallint,
CONSTRAINT idstudent_date PRIMARY KEY (idstudent_date)
)
WITH (
OIDS=FALSE
);
ALTER TABLE students_dates
OWNER TO postgres;

谁能帮帮我?

非常感谢。

最佳答案

在 Postgres 中使用专有的 distinct on () 通常比使用窗口函数更快。

基于 Gordon 的 abs() 想法:

select distinct on (s.idstudent) s.*, sd.date_, sd.type
from students s
join students_dates sd on s.idstudent = sd.idstudent
order by s.idstudent, abs(sd.date_ - date '2015-09-26');

这也可以使用窗口函数来解决:

select idstudent, name, date_, type
from (
select s.idstudent, s.name, sd.date_, sd.type,
row_number() over (partition by s.idstudent order by sd.date_ - date '2015-09-26' desc) as rn
from students s
join students_dates sd on s.idstudent = sd.idstudent
) t
where rn = 1;

SQLFiddle:http://sqlfiddle.com/#!15/25fef/4

关于sql - 获取一组记录的最接近给定日期的日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32798912/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com