如何设置动态限值?
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 ALL
。 UNION
会产生删除重复值的开销。而且您的数据中似乎没有重复值。
此外,LEFT JOIN
是多余的。据推测,如果 analysis
.
中没有匹配项,您将不会获得任何行
在存储过程中,您可以构造查询然后执行。这是一种动态更改 table 名称、LIMIT
、OFFSET
和其他一些内容的方法。
我更喜欢在应用程序代码中进行此类更改。
我正在使用 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 ALL
。 UNION
会产生删除重复值的开销。而且您的数据中似乎没有重复值。
此外,LEFT JOIN
是多余的。据推测,如果 analysis
.
在存储过程中,您可以构造查询然后执行。这是一种动态更改 table 名称、LIMIT
、OFFSET
和其他一些内容的方法。
我更喜欢在应用程序代码中进行此类更改。