所以这是对问题的介绍。 2桌:
我想要选择所有工作人员和最后一个客户关联到具有client_action条件的工作人员,以及所述客户端的最后一个buy_date。并添加其他表中的所有信息(与问题无关)
因此,用我的条件选择worker_join_id的一种方法是
select w.worker_join_id, max(c.buy_date)
from client c
join worker w
on w.worker_join_id = c.worker_join_id
where c.client_action IN ('BuyItem1', ''BuyItem2', ''BuyItem4')
group by w.worker_join_id;
通过此选项,我可以访问我正在寻找的特定工作人员,以及我感兴趣的日期。 但是要从客户端表和其他表中添加信息,我需要做更多的连接。所以我想把这个请求放在“with”
中with MyTable (worker_join_id, buy_date) as (
select w.worker_join_id, max(c.buy_date)
from client c
join worker w
on w.worker_join_id = c.worker_join_id
where c.client_action IN ('BuyItem1', ''BuyItem2', ''BuyItem4')
group by w.worker_join_id)
然后通过MyTable上的联接进行选择以过滤我想要的内容:
select {lots of things}
from worker w
inner join client c
on w.w.worker_join_id = c.worker_join_id
and c.buy_date = (select t.buy_date from MyTable t
join client c_tmp
on t.worker_join_id = c_tmp.worker_join_id)
你的sql中强者可能已经注意到了这个问题,但是我的子请求给出了太多行。在我看来,我希望“c_tmp.worker_join_id”和“c.worker_join_id”是同一个东西,所以我会得到我想要的东西,但事实并非如此。
所以也许我需要彻底改变问题的方法,但我现在有点阻止。
如果你们有我的问题的解决方案,我会等待共同体的反馈。 感谢。
答案 0 :(得分:0)
这只是一个例子,首先运行子查询并检查
select {lots of things}
from worker w
inner join client c
on w.worker_join_id = c.worker_join_id
and c.buy_date = (select max(c.buy_date) buy_date from client c join worker w
join client c_tmp on w.worker_join_id = c.worker_join_id
where c.client_action IN ('BuyItem1', 'BuyItem2', 'BuyItem4') )
答案 1 :(得分:0)
看看窗口功能: https://docs.microsoft.com/en-us/sql/t-sql/functions/last-value-transact-sql
所以你想要一个工人的最后一个客户,对吗?
$DeviceMappings = @();
$charmap = 100;
foreach($Disk in $Disks)
{
$volume = @{DeviceName="xvd$([char]$charmap)";Ebs=@{VolumeSize=$Disk.Size;DeleteOnTermination="true";VolumeType="gp2"}};
$DeviceMappings += $volume;
$charmap++;
}
仅作为一个例子
SELECT DISTINCT
stuff,
last_value(c.client_join_id) OVER (PARTITION BY c.worker_join_id ORDER BY c.buy_date RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) AS last_client_join_id
FROM worker w
JOIN client c USING (worker_join_id)
WHERE c.client_action IN ('BuyItem1', 'BuyItem2', 'BuyItem4')
的作用类似于PARTITION
,而不将分组应用于结果集。因此GROUP BY
获取每个组的最后一个值,按buy_date排序。
last_value
是必要的,因为正如我之前所说,这不适用任何分组,所以你会有重复的。
答案 2 :(得分:0)
我认为你可以在子查询中的子查询之外引用表。
所以在我的情况下,我可以保持查询'架构'并像我这样进行查询
select {lots of things}
from worker w
inner join client c
on w.w.worker_join_id = c.worker_join_id
and c.buy_date = (select t.buy_date from MyTable t
WHERE t.worker_join_id = c.worker_join_id)
在客户端表上使用引用允许我指定子查询,因此它只给出了匹配结果