Помогите, пожалуйста, составить запрос

arafikov
Дата: 02.02.2009 07:52:31
Помогите, пожалуйста, составить запрос:

В таблице MyTable у меня есть поля: id (идентификатор строки), IDSPISOK (ID сотрудника), DUVOL (дата увольнения) и VWORKOSN (VWORKOSN=1, если работа основная, и VWORKOSN=0, если совмещение).

В таблице есть строки с одинаковыми значениями IDSPISOK и DUVOL. Мне нужно оставить по одному значению (IDSPISOK;DUVOL), желательно с VWORKOSN=1. В результат вывести id этих строк. На MS Access я бы написал:

SELECT FIRST(id), IDSPISOK, DUVOL
FROM MyTable
GROUP BY IDSPISOK, DUVOL
ORDER BY VWORKOSN DESC

Но в Transact-SQL нет функции FIRST. Как правильно составить такой запрос?

Заранее спасибо.

Microsoft SQL Server  2000 - 8.00.194 (Intel X86) 
Aug 6 2000 00:57:48
Copyright (c) 1988-2000 Microsoft Corporation
Developer Edition on Windows NT 5.1 (Build 2600: Service Pack 3)
Knyazev Alexey
Дата: 02.02.2009 07:53:37
SELECT MIN(id), IDSPISOK, DUVOL
FROM MyTable
GROUP BY IDSPISOK, DUVOL
ORDER BY VWORKOSN DESC
arafikov
Дата: 02.02.2009 08:03:33
SELECT MIN(id), IDSPISOK, DUVOL
FROM MyTable
GROUP BY IDSPISOK, DUVOL
ORDER BY VWORKOSN DESC

Вышел пустой результат. У меня MyTable создается в пользовательской функции следующим образом:

CREATE FUNCTION dbo.IDUvol (@DOTCHSTART DATETIME,
                            @DOTCHEND DATETIME
)
RETURNS @tbl TABLE
        (id INT IDENTITY(1,1) NOT NULL,
         IDSPISOK UNIQUEIDENTIFIER,
         DUVOL DATETIME,
         VWORK CHAR(6),
         NPRIKEND CHAR(20),
         UVPRICH VARCHAR(160),
         PODR VARCHAR(143),
         DOLG VARCHAR(160),
         IDPODR INT,
         VWORKOSN INT
         )
...
INSERT INTO @tbl(..) VALUES(..)

Пробую выполнить:

SELECT MIN(uvgr.id), uvgr.IDSPISOK, uvgr.DUVOL
FROM KADRS_UN.dbo.IDUvol('01/01/2007', '01/01/2008') uvgr
GROUP BY uvgr.IDSPISOK, uvgr.DUVOL
ORDER BY uvgr.VWORKOSN DESC

результат - ни одной строки.

а запрос:

SELECT uvgr.*
FROM  KADRS_UN.dbo.IDUvol('01/01/2007', '01/01/2008') uvgr

возвращает 31 строку.

Почему-то таблица ведет себя нестандартно.
arafikov
Дата: 02.02.2009 08:33:26
Запрос заработал, но он выдает 31 запись, все id остались, ни один не исключился из запроса.

SELECT MIN(uvgr.id) AS MIN_ID, uvgr.IDSPISOK, uvgr.DUVOL
FROM KADRS_UN.dbo.IDUvol('01/01/2007', '01/01/2008') uvgr
GROUP BY uvgr.IDSPISOK, uvgr.DUVOL,uvgr.VWORKOSN
ORDER BY uvgr.VWORKOSN DESC
arafikov
Дата: 02.02.2009 08:47:54
Спасибо, Knyazev Alexey, за подсказку про MIN(id). Все заработало! Запрос получился такой:

SELECT MIN(uvgr.id) AS MIN_ID, MAX(uvgr.VWORKOSN) AS MAX_VWORK, uvgr.IDSPISOK, uvgr.DUVOL
FROM KADRS_UN.dbo.IDUvol('01/01/2007', '01/01/2008') uvgr
GROUP BY uvgr.IDSPISOK, uvgr.DUVOL
borin
Дата: 02.02.2009 10:11:24
arafikov

Но в Transact-SQL нет функции FIRST. Как правильно составить такой запрос?


есть зато
top 1
Gator
Дата: 02.02.2009 10:28:40
arafikov
Спасибо, Knyazev Alexey, за подсказку про MIN(id). Все заработало! Запрос получился такой:

SELECT MIN(uvgr.id) AS MIN_ID, MAX(uvgr.VWORKOSN) AS MAX_VWORK, uvgr.IDSPISOK, uvgr.DUVOL
FROM KADRS_UN.dbo.IDUvol('01/01/2007', '01/01/2008') uvgr
GROUP BY uvgr.IDSPISOK, uvgr.DUVOL
А почему не MAX, AVG, [другая функция, возвращающая одно значение]?