如何解决如何动态设置限制值?
我正在使用 BI 工具,它可以选择编写 SQL 查询。我有一张像
这样的桌子表名 - 分析
模块 | 价值 |
---|---|
领导 | 5 |
交易 | 3 |
表格名称 - 潜在客户
模块名称 | 姓名 | 创建日期 |
---|---|---|
领导 | AAA | 03-02-2021 |
领导 | BBB | 03-02-2021 |
领导 | CCC | 03-02-2021 |
领导 | FFF | 03-02-2021 |
领导 | MMM | 03-02-2021 |
领导 | 哦 | 02-02-2021 |
领导 | PPP | 02-02-2021 |
表格名称 - 交易
模块名称 | 姓名 | 创建日期 |
---|---|---|
交易 | DDD | 03-02-2021 |
交易 | GGG | 03-02-2021 |
交易 | EE | 03-02-2021 |
交易 | 03-02-2021 | |
交易 | SSS | 02-02-2021 |
交易 | TTT | 02-02-2021 |
以上值不是静态值,它们会每小时更新一次。
我必须使用这些值并根据最新创建日期设置显示行数的限制
我必须得到输出
模块 | lead_name |
---|---|
领导 | AAA |
领导 | BBB |
领导 | CCC |
领导 | FFF |
领导 | MMM |
交易 | DDD |
交易 | GGG |
交易 | EE |
我尝试了以下
SELECT module_name as module,lead_name as name
from Leads
left join Analysis on Leads.module_name=Analysis.Module
Order by Leads.Created_Date DESC
LIMIT to_integer(Analysis.Value)
UNION
SELECT Deals.module_name as module,Deals.deal_name as name
from Deals
left join Analysis on Deals.module_name=Analysis.Module
Order by Deals.Created_Date DESC
LIMIT to_integer(Analysis.Value)
是否可以动态设置限制?
谢谢
解决方法
我建议使用 row_number()
:
select l.module_name,l.Name,l.created_date
from (select l.*,row_number() over (order by created_date desc) as seqnum
from leads l
) l
where seqnum < (select a.value from analysis a where a.module = 'Lead')
union all
select d.module_name,d.Name,d.created_date
from (select d.*,row_number() over (order by created_date desc) as seqnum
from deals d
) d
where seqnum < (select a.value from analysis a where a.module = 'Deal');
注意:使用 UNION ALL
。 UNION
会产生删除重复值的开销。并且您的数据中似乎没有重复值。
此外,LEFT JOIN
是多余的。据推测,如果 analysis
中没有匹配项,您将不会得到任何行。
最后,这是一项痛苦的任务,但是我已经在 MySql v8.0 中编写了代码。如果您使用的是较低版本,那么您可能无法使用 CTE
。在这种情况下,您可以使用子查询。所以,这是下面给出的代码=>
WITH CTE AS
(SELECT module_name as module,lead_name as name,CASE WHEN
ROW_NUMBER() OVER(Order by Leads.module_name)<=Analysis.Value
THEN 1
ELSE 0 END AS IsSelected
from Leads
left join Analysis on Leads.module_name=Analysis.Module
UNION
SELECT Deals.module_name as module,Deals.deal_name as name,CASE WHEN
ROW_NUMBER() OVER(Order by Deals.module_name)<=Analysis.Value
THEN 1
ELSE 0 END AS IsSelected
from Deals
left join Analysis on Deals.module_name=Analysis.Module
)
SELECT module,name FROM CTE WHERE IsSelected=1
注意:您可以在 DB Fiddle 中查看我的代码。
,在存储过程中,您可以构造查询然后执行。这是一种动态更改表名、LIMIT
、OFFSET
和其他一些内容的方法。
我更喜欢在应用程序代码中进行此类更改。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。