我正在寻找提高去年参加者查询的表现。现在,它花了20多分钟来运行这个区块。
LYA参加特定活动的最近一年,并在最长时间之前找到他们参加的那一年。例如,如果他们在2018年参加了一个活动,那么查询将查找2018年之前参加的最后一年。
2018年的LYA应该返回Null
数据应返回以下内容:
CompanyID MarketID Industry LAST YEAR ATTENDED
-------------------------------------------------------
123456 1234 GIFT 2018
123457 1234 HOME 2017
123458 1234 GIFT 2018
123459 1234 HOME 2018
123460 1234 APPAREL 2018
123461 1234 HOME 2018
123462 1234 HOME 2017
123463 1234 APPAREL 2018
有人可以帮忙吗?
SELECT DISTINCT
COMPANYID, MARKETID, INDUSTRY,
[LAST YEAR ATTENDED] = (SELECT MAX(YEAR(attdate))
FROM v_marketatt va
WHERE va.companyid = vm.companyid
AND YEAR(attdate) <> (SELECT MAX(YEAR(attdate))
FROM v_marketatt vb
WHERE vb.companyid = vm.companyid)
AND MARKETCODE LIKE 'SM1%')
FROM
v_marketatt vm
WHERE
MARKETID IN (835, 1032, 1101)
更新:
发现版本比其他版本更有效。在克隆上运行时间长达7分钟。不要让子查询两次进入我的视图,而是让它浸入一次。
select
DISTINCT COMPANYID,
MARKETID,
INDUSTRY,
CSTATUS,
[LAST YEAR ATTENDED] = (select max(year(attdate)) from v_marketatt va where year(attdate) <> (select max(year(attdate)) from v_marketatt) AND MARKETCODE LIKE 'SM1%' AND va.COMPANYID = vm.COMPANYID)
from v_marketatt vm
WHERE MARKETID IN (835,1032,1101)
;
感谢所有回复的人。
答案 0 :(得分:0)
[[LAST YEAR ATENDED]字段有一个子查询,用于计算每次迭代的最大年份。您可以尝试将此查询移动到类似
的连接 select DISTINCT COMPANYID, MARKETID, INDUSTRY,
[LAST YEAR ATTENDED]
from v_marketatt vm
inner join
( select max(year(attdate)) as [LAST YEAR ATTENDED]
from v_marketatt ivm
where year(ivm.attdate) <> (select max(year(attdate))
from v_marketatt vb
where vb.companyid =
ivm.companyid)
AND MARKETCODE LIKE 'SM1%')va on va.companyid = vm.companyid
--where companyid not in (select distinct companyid from
v_marketatt where marketid in (602))
WHERE MARKETID IN (835,1032,1101)
我没有运行此查询,可能会对语法进行一些小的修正,但是如果你得到这个概念,它应该很容易选择和修复。
答案 1 :(得分:0)
语法道歉,我快速将它们放在一起。但我怀疑使用CTE可以大大提高性能。我也不太清楚你在这做什么:
WHERE va.companyid = vm.companyid
AND YEAR(attdate) <> (SELECT MAX(YEAR(attdate))
FROM v_marketatt vb)
AND MARKETCODE LIKE 'SM1%'
所以我独自离开了那一块。尝试这样的事情,这应该有所帮助,并且可能澄清我上面提到的部分可能解锁其他事情来调整。
;with Year_CTE (year)
as
(SELECT MAX(YEAR(attdate), va.companyid)
FROM v_marketatt va
WHERE va.companyid = vm.companyid
AND YEAR(attdate) <> (SELECT MAX(YEAR(attdate))
FROM v_marketatt vb)
AND MARKETCODE LIKE 'SM1%')
SELECT DISTINCT
COMPANYID, MARKETID, INDUSTRY,
vb.[YEAR]
FROM
v_marketatt vm
join Year_CTE vb on vb.companyid = vm.companyid
WHERE
MARKETID IN (835, 1032, 1101)
答案 2 :(得分:0)
如果您需要“此前的那个”,我建议您使用var popupViewModel = new NetworkNameDescriptorViewModel(_eventAggregator)
{
DescriptorContext = new DescriptorModel {
Hex = obj.Hex,
Tag = obj.Tag,
Length = obj.Length,
Name = obj.Name
}
};
var popupView =_container.Resolve<NetworkNameDescriptor.NetworkNameDescriptor>();
popupView.DataContext = popupViewModel;
Window window = new Window()
{
Title = "Network name descriptor",
Content = popupView
};
window.Show();
或LEAD()
个功能。
虽然我不太确定我完全理解你的例子(参见Thorsten Kettners评论),但按照解释我认为你想要的是:
LAG()
由于我没有这里的表格或数据,我没有测试过这个查询,但我希望它会让你去...