我有一张有字段和数据的表格,如下所示。
appid determid empid empchargeperc
1 14 79 1.0
1 15 71 0.42
1 16 70 0.04
1 16 71 0.41
1 16 79 0.13
我想要的是基于最后2个确定id (15和16在上表),我想得到所有的雇主id(埃米特),按照以下3项条件。
所以我想归还70,71,79。我写了下面的查询,我得到了预期的输出。
SELECT DISTINCT a.appid, a.empid
FROM dbo.emp a JOIN dbo.emp b ON b.appid= a.appid
WHERE a.determid IN (SELECT TOP(2) determid FROM dbo.determ
WHERE appid = @appid ORDER BY createdate DESC) AND
a.empchargeperc <> b.empchargeperc
但下表的输出不正确。我得到的埃默斯是47和81,但我认为不应该退货,因为30的决定,47的皮脂匹配,决定了45的空虚47的人。empid 81也一样。
appid determid empid empchargeperc
1 11 47 0.16
1 11 81 0.83
1 30 47 0.16
1 30 81 0.83
1 45 47 0.16
1 45 81 0.83
任何帮助都会很感激的。
发布于 2018-03-15 21:53:53
从条件的描述来看,这听起来像是带有having
子句的聚合:
select empid
from (select d.*, dense_rank() over (order by determid desc) as rnk
from determ d
) d
where rnk <= 2
group by empid
having min(determid) = max(determid) or
min(empchargeperc) <> max(empchargeperc);
发布于 2018-03-15 22:14:36
你可以用CTE清楚地做复杂的事情--下面我已经用这个技术做了第1和第2步。
WITH NEW_D AS
(
SELECT MAX(determid) as determnd
FROM dbo.determ
WHERE appid = @appid
), OLD_D AS
(
SELECT MAX(determid) as determid
FROM dbo.determ, NEW_D
WHERE appid = @appid AND determid <> NEW_D.determid
), EMP_NEW AS
(
SELECT empid
FROM emp, NEW_D
WHERE appid = @appid AND determid = NEW_D.determid
), EMP_OLD AS
(
SELECT empid
FROM emp, OLD_D
WHERE appid = @appid AND determid = OLD_D.determid
)
SELECT empid
FROM EMP_OLD
WHERE empid NOT IN (SELECT empid FROM EMP_NEW)
UNION ALL
SELECT empid
FROM EMP_NEW
WHERE empid NOT IN (SELECT empid FROM EMP_OLD)
https://stackoverflow.com/questions/49309818
复制相似问题