获取下一个可用行

时间:2010-08-27 01:21:52

标签: sql mysql greatest-n-per-group

如何获取列表所有具有最低工作职位的JobPositionNames当ContactId = 1时

表1:

| JobPositionId | JobPositionName | JobDescriptionId | JobCategoryId | ContactId
---------------------------------------------------------------------------------
       1        |  Audio Cables   |      1           |      1        |     1
       2        |Audio Connections|      2           |      1        |     1
       3        |Audio Connections|      2           |      1        |     0
       4        |Audio Connections|      2           |      1        |     0
       5        |   Sound Board   |      3           |      1        |     0
       6        |   Tent Pen      |      4           |      3        |     0

例如,该表的结果应为第1,3,5,6行

3 个答案:

答案 0 :(得分:0)

我无法弄清楚解决方案。 只缺少一些东西,但我可以为你提供一些代码查看。 也许它可以帮助你。

--create table
create table t
(
JobPositionId int identity(1,1) primary key,
JobPositionName nvarchar(100) not null,
JobDescriptionId int,
JobCategoryId int,
ContactId int
)
go

--insert values
BEGIN TRAN

INSERT INTO t VALUES ('AudioCables', 1,1,1)
INSERT INTO t VALUES ('AudioConnections',2,1,1)
INSERT INTO t VALUES ('AudioConnections',2,1,0)
INSERT INTO t VALUES ('AudioConnections',2,1,0)
INSERT INTO t VALUES ('SoundBoard',3,1,0)
INSERT INTO t VALUES ('TentPen',4,3,0)
COMMIT TRAN
GO

SELECT 
    Min(JobPositionId) AS JobPositionId, JobPositionName, ContactId
INTO
    #tempTable
FROM 
    t
GROUP BY JobPositionName, ContactId

SELECT * FROM #tempTable
WHERE JobPositionId IN (
    SELECT JobPositionId
    FROM #tempTable
    GROUP BY JobPositionName
    --... lack of sth, I can't figure out ,sorry.
)

drop table t
GO

答案 1 :(得分:0)

对于每组最大/最小查询,您可以使用null-self-join以及subselect等策略。这通常在MySQL中更快。

SELECT j0.JobPositionId, j0.JobPositionName, j0.ContactId
FROM Jobs AS j0
LEFT JOIN Jobs AS j1 ON j1.JobPositionName=j0.JobPositionName
AND (
    (j1.ContactId<>0)<(j0.ContactId<>0)
    OR ((j1.ContactId<>0)=(j0.ContactId<>0) AND j1.JobPositionId<j0.JobPositionId))
)
WHERE j1.JobPositionName IS NULL

这表示,对于每个JobPositionName,找到不存在具有较低排序值的其他行的行。此处的排序值为复合[ContactId - 非zeroness,JobPositionId]。

(旁白:JobPositionNameJobCategoryId不应该标准化为JobDescriptionId上的关键字表格?并且不应取消分配ContactIdNULL }?)

答案 2 :(得分:0)

SELECT  jp.*
FROM    (
        SELECT  JobPositionName, JobPositionId, COUNT(*) AS cnt
        FROM    JobPosisions
        ) jpd
JOIN    JobPosisions jp
ON      jp.JobPositionId =
        IF(
        cnt = 1,
        jpd.JobPositionId,
        (
        SELECT  MIN(JobPositionId)
        FROM    JobPositions jpi
        WHERE   jpi.JobPositionName = jpd.JobPositionName
                AND jpi.ContactID = 0
        )
        )

(JobPositionName, ContactId, JobPositionId)上创建一个索引,以便快速工作。

请注意,如果不会返回具有多个职位的职位,这两职位都没有ContactID = 0