如何根据优先级字段选择获胜记录

时间:2014-09-10 18:34:44

标签: sql

我有一个包含以下列的表:

eIDPK),memberIDPK),eNamepriorityqualified

特定eIDmemberID组合可能有多条记录,但每条记录都有不同的优先级,所以像这样的

1234, jsmith, news,         1, NULL
2345, jsmith, reactivation, 2, NULL

我需要编写一个查询来评估表中的行并根据优先级分配限定列,因此结果将是

1234, jsmith, news,         1, Y
2345, jsmith, reactivation, 2, N

因此,为了使问题复杂化,我的表将在一天之内添加行,并且每次添加一组新数据时,我将需要重新运行优先级查询。

一个恼人的说明,我不能使用游标,变量或临时表来执行此操作。我可以临时创建支持表并将数据复制到它们,但它们可以是物理表。

任何帮助将不胜感激。如果我对这个问题的描述很糟糕,我道歉,让我知道如何更能解释,我将尽我所能。

感谢

2 个答案:

答案 0 :(得分:0)

如果我正确理解了这个问题,我认为这个SQL会给你你想要的东西

UPDATE MyTable SET qualified='N'
UPDATE MyTable
SET MyTable.qualified = 'Y'
FROM MyTable
INNER JOIN (select memberID, MIN([priority]) as [priority] FROM MyTable GROUP BY memberID) T2
ON T2.memberID=MyTable.memberID AND T2.priority = MyTable.priority

试一试,看看我是否正确理解了要求

答案 1 :(得分:0)

取不合格作为基表的名称,我会在顶部创建一个视图。

在您的情况下,视图的优势在于,您不必在添加新成员/优先级记录时重新计算合格的条目,因此结果始终是" live"。

你可以在底层表上有一个already_processed_flag,并在视图上添加逻辑来处理它。

create view qualified_view
(eid, memberId, ename, priority, qualified)
as 
select eid, memberId, ename, priority, 'Y' as qualified

from unqualified
where not exists 
/* is there anything @ higher priority? */

(select 1 from unqualified s
where s.memberId = unqualified.memberId
where s.eid <> unqualified.eid and s.priority > unqualified.priority
)

union

select eid, memberId, ename, priority, 'N' as qualified

from unqualified
where exists 
(select 1 from unqualified s
where s.memberId = unqualified.memberId
where s.eid <> unqualified.eid and s.priority > unqualified.priority
)

现在联盟可以处理更紧急的情况,如果不存在,则不知道您的目标是哪个数据库。

例如,在Oracle中,您可能会使用NVL,而不是这样(语法错误是可能的,徒手做到这一点):

create view qualified_view
(eid, memberId, ename, priority, qualified)
as 
    select eid, memberId, ename, priority,
NVL((select 'Y' from unqualified s
where s.memberId = unqualified.memberId
where s.eid <> unqualified.eid and s.priority > unqualified.priority
limit 1
),'N') as qualified
from unqualified

MS SQLServer粗略等效于NVL,isNull。其他RDBMS可能有也可能没有类似的东西。