Некоторые СУБД могут иметь некоторую функциональность OLAP, которая упрощает запись таких запросов, но IBM Informix Dynamic Server (IDS) еще не имеет таких функций.
Давайте предположим, ради конкретности, что ваша таблица называется «ProductSectors» и имеет структуру, как:
CREATE TABLE ProductSectors
(
ProductID INTEGER NOT NULL,
Sector INTEGER NOT NULL CHECK (Sector > 0),
Name VARCHAR(20) NOT NULL,
PRIMARY KEY (ProductID, Sector)
);
Что вы ищете в частности ProductID список минимального и максимального смежный ценности Сектора. Диапазон смежный, когда нет значения, меньшего, чем минимум, и ни одного значения больше максимального, и нет пробела в пределах диапазона. Это сложный вопрос:
SELECT P1.ProductID, P1.Sector AS Min_Sector, P2.Sector AS Max_Sector
FROM ProductSectors P1 JOIN ProductSectors P2
ON P1.ProductID = P2.ProductID
AND P1.Sector <= P2.Sector
WHERE NOT EXISTS (SELECT * -- no entry one smaller
FROM ProductSectors P6
WHERE P1.ProductID = P6.ProductID
AND P1.Sector - 1 = P6.Sector
)
AND NOT EXISTS (SELECT * -- no entry one larger
FROM ProductSectors P5
WHERE P2.ProductID = P5.ProductID
AND P2.Sector + 1 = P5.Sector
)
AND NOT EXISTS (SELECT * -- no gaps between P1.Sector and P2.Sector
FROM ProductSectors P3
WHERE P1.ProductID = P3.ProductID
AND P1.Sector <= P3.Sector
AND P2.Sector > P3.Sector
AND NOT EXISTS (SELECT *
FROM ProductSectors P4
WHERE P4.ProductID = P3.ProductID
AND P4.Sector = P3.Sector + 1
)
)
ORDER BY P1.ProductID, Min_Sector;
А вот след от общего запроса работы с данными выборки:
CREATE TEMP TABLE productsectors
(
ProductID INTEGER NOT NULL,
Sector INTEGER NOT NULL CHECK(Sector > 0),
Name VARCHAR(20),
PRIMARY KEY (ProductID, Sector)
);
И некоторые примеры данных, с различными зазорами:
INSERT INTO ProductSectors VALUES(101, 1, "101:1");
INSERT INTO ProductSectors VALUES(101, 2, "101:2");
INSERT INTO ProductSectors VALUES(101, 3, "101:3");
INSERT INTO ProductSectors VALUES(101, 4, "101:4");
INSERT INTO ProductSectors VALUES(101, 5, "101:5");
INSERT INTO ProductSectors VALUES(101, 6, "101:6");
INSERT INTO ProductSectors VALUES(101, 7, "101:7");
INSERT INTO ProductSectors VALUES(102, 1, "102:1");
INSERT INTO ProductSectors VALUES(102, 2, "102:2");
INSERT INTO ProductSectors VALUES(102, 4, "102:4");
INSERT INTO ProductSectors VALUES(102, 5, "102:5");
INSERT INTO ProductSectors VALUES(102, 6, "102:6");
INSERT INTO ProductSectors VALUES(102, 7, "102:7");
INSERT INTO ProductSectors VALUES(103, 1, "103:1");
INSERT INTO ProductSectors VALUES(103, 2, "103:2");
INSERT INTO ProductSectors VALUES(103, 4, "103:4");
INSERT INTO ProductSectors VALUES(103, 6, "103:6");
INSERT INTO ProductSectors VALUES(103, 7, "103:7");
INSERT INTO ProductSectors VALUES(104, 1, "104:1");
INSERT INTO ProductSectors VALUES(104, 2, "104:2");
INSERT INTO ProductSectors VALUES(104, 3, "104:3");
INSERT INTO ProductSectors VALUES(104, 6, "104:6");
INSERT INTO ProductSectors VALUES(104, 7, "104:7");
INSERT INTO ProductSectors VALUES(105, 1, "105:1");
INSERT INTO ProductSectors VALUES(105, 4, "105:4");
INSERT INTO ProductSectors VALUES(105, 5, "105:5");
INSERT INTO ProductSectors VALUES(105, 7, "105:7");
INSERT INTO ProductSectors VALUES(106, 1, "106:1");
INSERT INTO ProductSectors VALUES(106, 2, "106:1");
INSERT INTO ProductSectors VALUES(106, 3, "106:1");
INSERT INTO ProductSectors VALUES(106, 7, "106:7");
INSERT INTO ProductSectors VALUES(107, 7, "107:7");
INSERT INTO ProductSectors VALUES(108, 8, "108:8");
INSERT INTO ProductSectors VALUES(108, 9, "108:9");
Требуемый выход - также фактический выход:
101|1|7
102|1|2
102|4|7
103|1|2
103|4|4
103|6|7
104|1|3
104|6|7
105|1|1
105|4|5
105|7|7
106|1|3
106|7|7
107|7|7
108|8|9
С ожидаемыми результатами на MacOS X 10.6.2, IDS 11.50.FC4W1, SQLCMD 86.04.