Как я могу получить список всех имен JobPositionNames, имеющих самый низкий jobPositionId, когда ContactId = 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
Я не могу понять решение. Только отсутствие чего-то, но я могу дать некоторый код для вас. Может быть, это может вам помочь.
--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
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
Для максимальных/минимальных запросов для каждой группы вы можете использовать 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
?)
ContactId
- только 1 для строки 1 в вашем примере.