Получение следующей доступной строки

0

Как я могу получить список всех имен JobPositionNames, имеющих самый низкий jobPositionId, когда ContactId = 1

Tablel:

| 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

  • 0
    Но ContactId - только 1 для строки 1 в вашем примере.
  • 0
    Я хочу, чтобы все уникальные JobPositionNames (аудиокабели, аудиоподключения, звуковая плата, перо для палатки) и для позиций, где их более одного (2,3,4), требуют наименьший идентификатор JobpositionId, когда Contactid = 0
Теги:
greatest-n-per-group

3 ответа

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
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

0

Для максимальных/минимальных запросов для каждой группы вы можете использовать null-self-join, а также стратегии, такие как подвыборки. Это, как правило, быстрее в 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 -незамеренность, JobPositionId].

(Помимо этого: не следует ли JobPositionName и JobCategoryId быть нормализованным в таблицу с ключом JobDescriptionId? И не должен не присваиваться ContactId be NULL?)

  • 0
    Это должно быть внешнее соединение? Есть ли какой-то странный синтаксис для MySql, который делает JOIN там внешним?
  • 0
    упс, да, вы правы, я как-то забыл набрать «ВЛЕВО». Приветствия.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню