2010-01-02 2 views
1

У меня есть таблица с полем, называемым сектором, каждый сектор обычно что-то вроде 1,2,3,4,5,6,7 и т. Д.Как получить диапазоны серийных номеров в sql?

Я хочу показать доступные сектора в приложении, я думал, что показать все 1,2,3,4,5,6,7 немым, поэтому я должен показать «от 1 до 7».

Проблема в том, что иногда сектора пропускают одно число, подобное этому 1,2,3, 5,6,7. Итак, я хочу показать что-то вроде от 1 до 3, от 5 до 7.

Как я могу запросить это в sql для показа в моем приложении?

ответ

2

Некоторые СУБД могут иметь некоторую функциональность 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.

0

нормально, я смотрел глубже и нашел this

Он работает :), надеюсь, что это поможет кому-то, как он помог мне.

2

Это называется «Пробелы» в sql. Вот подробная статья "Article"

Смежные вопросы