如何在SQL中获取与请求参数最接近的值?
我有一个table shop\u staff\u relationvm,用于保存员工和店铺之间的关系 它有3列:id_商店、id_员工和更改日期 id_staff=>staff外键 id_shop=>shop外键 change_date==>每当创建新的员工-店铺关系时,我保存设置日期员工的店铺可能会多次更改 3个abov列表示shop_staff_relationvm表的可嵌入主键 在查询中,我有两个请求参数:idShop和一个日期 我正在尝试获取特定月份内属于特定店铺idShop的员工列表 因此,当请求月份介于员工与店铺关系的第一个日期和关系的最后一个日期之间时,我需要获取员工列表 这是一个例子:如何在SQL中获取与请求参数最接近的值?,sql,postgresql,Sql,Postgresql,我有一个table shop\u staff\u relationvm,用于保存员工和店铺之间的关系 它有3列:id_商店、id_员工和更改日期 id_staff=>staff外键 id_shop=>shop外键 change_date==>每当创建新的员工-店铺关系时,我保存设置日期员工的店铺可能会多次更改 3个abov列表示shop_staff_relationvm表的可嵌入主键 在查询中,我有两个请求参数:idShop和一个日期 我正在尝试获取特定月份内属于特定店铺idShop的员工列表
STAFF | SHOP | CHANGE DATE
----------+----------+-------------
Staff A | Shop 1 | 10-01-2019
Staff A | Shop 2 | 10-03-2019
Staff A | Shop 3 | 10-05-2019
假设我们有requestMonth=02-2019
然后:1号店有员工A,2号店没有员工,3号店没有员工
假设我们有requestMonth=03-2019
然后:1号店将没有员工,2号店将有员工A,3号店将没有员工
假设我们有一个月=06-2019
然后:1号铺将没有员工,2号铺将没有员工,3号铺将有员工
这是我提出的公式:
first date of relation <= requestMonth <= first date of next relation
我对查询的这部分有问题:
((SELECT ((LEAD (to_date(to_char(ss.change_date, 'yyyy-MM'), 'yyyy-MM')) OVER (ORDER BY ss.id_staff DESC)) > to_date('2019-02-16', 'yyyy-MM') )
FROM shop_staff_relationvm ss WHERE ss.id_staff = s.id_staff and ss.id_shop !=2 LIMIT 1)
and
(SELECT (MIN(to_date(to_char(ss.change_date, 'yyyy-MM'), 'yyyy-MM')) <= to_date('2019-02-16', 'yyyy-MM'))
FROM shop_staff_relationvm ss WHERE ss.id_staff = s.id_staff and ss.id_shop = 2))
如果您希望在特定日期获得员工,可以使用distinct on
您的问题是关于一个表的,但您的代码包括其他表。是的,因为我也需要来自staff表的一些数据
((SELECT ((LEAD (to_date(to_char(ss.change_date, 'yyyy-MM'), 'yyyy-MM')) OVER (ORDER BY ss.id_staff DESC)) > to_date('2019-02-16', 'yyyy-MM') )
FROM shop_staff_relationvm ss WHERE ss.id_staff = s.id_staff and ss.id_shop !=2 LIMIT 1)
and
(SELECT (MIN(to_date(to_char(ss.change_date, 'yyyy-MM'), 'yyyy-MM')) <= to_date('2019-02-16', 'yyyy-MM'))
FROM shop_staff_relationvm ss WHERE ss.id_staff = s.id_staff and ss.id_shop = 2))
select distinct on (ss.id_staff) ss.*
from shop_staff_relationvm ss
where ss.change_date <= '2019-02-01'::date
order by ss.id_staff, ss.change_date desc;
select s.*
from (select distinct on (ss.id_staff) ss.*
from shop_staff_relationvm ss
where ss.change_date <= '2019-02-01'::date
order by ss.id_staff, ss.change_date desc
) s
where s.shop_id = 2;