如何设置动态限值?

How to set limit value dynamic?

我正在使用 BI 工具,它可以选择编写 SQL 查询。我有一个像

这样的表格

Table 名称 - 分析

Module Value
Lead 5
Deal 3

Table 姓名 - 潜在客户

module_name Name created_date
Lead AAA 03-02-2021
Lead BBB 03-02-2021
Lead CCC 03-02-2021
Lead FFF 03-02-2021
Lead MMM 03-02-2021
Lead ooo 02-02-2021
Lead ppp 02-02-2021

Table 名称 - 交易

module_name Name created_date
Deal DDD 03-02-2021
Deal GGG 03-02-2021
Deal EEE 03-02-2021
Deal QQQ 03-02-2021
Deal SSS 02-02-2021
Deal TTT 02-02-2021

以上值不是静态值,它们会每小时更新一次。

我必须使用这些值并根据最新创建日期设置要显示的行数限制

我必须得到输出

Module lead_name
Lead AAA
Lead BBB
Lead CCC
Lead FFF
Lead MMM
Deal DDD
Deal GGG
Deal EEE

我尝试了以下方法

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)

是否可以动态设置限制?

谢谢

最后,这是一个痛苦的任务,但是我已经在MySql v8.0中编写了代码。如果您使用的是较低版本,那么您可能无法使用 CTE。在那种情况下,您可以使用 subquery.So,这是下面给出的代码=>

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.

中查看我的代码

我建议使用 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 ALLUNION 会产生删除重复值的开销。而且您的数据中似乎没有重复值。

此外,LEFT JOIN 是多余的。据推测,如果 analysis.

中没有匹配项,您将不会获得任何行

在存储过程中,您可以构造查询然后执行。这是一种动态更改 table 名称、LIMITOFFSET 和其他一些内容的方法。

我更喜欢在应用程序代码中进行此类更改。