Определите, являются ли несколько почтовых индексов смежными - PullRequest
3 голосов
/ 23 июля 2011

У моего клиента есть регионы продаж, где каждый регион продаж состоит из списка почтовых индексов.Регионы довольно большие и их легче хранить в формате, подобном следующему:

Область состоит из диапазона почтового индекса от 00602 до 10012 и от 20020 до 30020.

Как получить список из почтового индексакоды к списку таких диапазонов почтовых индексов?

Рассмотрим следующие данные

--This would be my list of all available zip codes in us:

CREATE TABLE [Zip](
    [Zip] [nvarchar](20) ,
    [State] [nvarchar](50) ,
)

--This would be the Sales Region List

CREATE TABLE [dbo].[SalesRegion](
    [AreaCode] [nvarchar](50) 
) 

--This would be the original large list Zip Codes for the SalesRegions

CREATE TABLE [dbo].[EnteredZip](
    [Zip] [nvarchar](20) ,
    [AreaCode] [nvarchar](50) 
) 

--This is where I would like to store the Zip Code Ranges

CREATE TABLE [dbo].[SearchableZip](
    [StartZip] [nvarchar](20) ,
    [EndZip] [nvarchar](20) ,
    [AreaCode] [nvarchar](50) 
) 

--Here is my sample Data:

--Some Zip Codes in US
insert into dbo.Zip (Zip,[State]) values ('00501'   ,'PR')
insert into dbo.Zip (Zip,[State]) values ('00544'   ,'PR')
insert into dbo.Zip (Zip,[State]) values ('00601'   ,'PR')
insert into dbo.Zip (Zip,[State]) values ('00602'   ,'PR')
insert into dbo.Zip (Zip,[State]) values ('00603'   ,'PR')
insert into dbo.Zip (Zip,[State]) values ('00604'   ,'PR')
insert into dbo.Zip (Zip,[State]) values ('00605'   ,'PR')
insert into dbo.Zip (Zip,[State]) values ('00606'   ,'PR')
insert into dbo.Zip (Zip,[State]) values ('00610'   ,'PR')
insert into dbo.Zip (Zip,[State]) values ('00611'   ,'PR')
insert into dbo.Zip (Zip,[State]) values ('00612'   ,'PR')


--Some Sales Regions

Insert Into dbo.SalesRegion ( AreaCode ) values('Area1')
Insert Into dbo.SalesRegion ( AreaCode ) values('Area2')
Insert Into dbo.SalesRegion ( AreaCode ) values('Area3')


--The zip codes of the Sales Regions
insert Into EnteredZip (Zip,AreaCode) values ('00544' , 'Area1')
insert Into EnteredZip (Zip,AreaCode) values ('00601' , 'Area1')
insert Into EnteredZip (Zip,AreaCode) values ('00602' , 'Area1')

insert Into EnteredZip (Zip,AreaCode) values ('00604' , 'Area2')
insert Into EnteredZip (Zip,AreaCode) values ('00606' , 'Area2')

insert Into EnteredZip (Zip,AreaCode) values ('00501' , 'Area3')
insert Into EnteredZip (Zip,AreaCode) values ('00544' , 'Area3')
insert Into EnteredZip (Zip,AreaCode) values ('00601' , 'Area3')
insert Into EnteredZip (Zip,AreaCode) values ('00602' , 'Area3')
insert Into EnteredZip (Zip,AreaCode) values ('00603' , 'Area3')
insert Into EnteredZip (Zip,AreaCode) values ('00604' , 'Area3')

insert Into EnteredZip (Zip,AreaCode) values ('00610' , 'Area3')
insert Into EnteredZip (Zip,AreaCode) values ('00611' , 'Area3')
insert Into EnteredZip (Zip,AreaCode) values ('00612' , 'Area3')

Приведем к этой записи в таблице SearchableZip

AreaCode             StartZip             EndZip
-------------------- -------------------- -------------------------
Area1                00544                00602
Area2                00604                00604
Area2                00606                00606
Area3                00501                00604
Area3                00610                00612

Можно ли создать SearchableZip с помощью сценария sql?

РЕДАКТИРОВАТЬ

Я исправил объявление таблицы и выходные данные

Ответы [ 2 ]

7 голосов
/ 23 июля 2011

Да, можно получить диапазоны из списка одним запросом.Для этого вы будете использовать CTE , рейтинг и немного серого вещества :

WITH ranked AS (
  SELECT
    Zip,
    AreaCode,
    ZipGroup = CAST(Zip AS int)
             - ROW_NUMBER() OVER (PARTITION BY AreaCode ORDER BY Zip)
  FROM EnteredZip
)
SELECT
  StartZip = MIN(Zip),
  EndZip   = MAX(Zip),
  AreaCode
FROM ranked
GROUP BY AreaCode, ZipGroup

Выход:

StartZip             EndZip               AreaCode
-------------------- -------------------- -------------------------
00544                00544                Area1
00601                00602                Area1
00604                00604                Area2
00606                00606                Area2
00501                00501                Area3
00544                00544                Area3
00601                00604                Area3
00610                00612                Area3

Этот вывод не соответствует вашему, но он соответствует исходным данным.


ОБНОВЛЕНИЕ

Если таблица Zip является справочнойТаблица для определения непрерывности списка почтовых индексов, то вышеупомянутое решение должно быть изменено следующим образом:

WITH ZipRanked AS (
  SELECT
    Zip,
    State,
    ZipRank = ROW_NUMBER() OVER (PARTITION BY State ORDER BY Zip)
  FROM Zip
),
EnteredZipRanked AS (
  SELECT
    e.Zip,
    e.AreaCode,
    ZipGroup = z.ZipRank
             - ROW_NUMBER() OVER (PARTITION BY e.AreaCode ORDER BY e.Zip)
  FROM EnteredZip e
    INNER JOIN ZipRanked z ON e.Zip = z.Zip
)
SELECT
  StartZip = MIN(Zip),
  EndZip   = MAX(Zip),
  AreaCode
FROM EnteredZipRanked
GROUP BY AreaCode, ZipGroup
0 голосов
/ 23 июля 2011

Во-первых, я должен сказать вам, что то, что я думаю , что вы планируете делать, кажется мне плохой идеей. Таблица EnteredZip прекрасно подходит для хранения области, к которой принадлежит почтовый индекс. (Пока вы устанавливаете ограничение PRIMARY KEY на ZIP.)

Похоже, это примерно то, куда вы целитесь,

select areacode, min(zip), max(zip)
from enteredzip
group by areacode
order by areacode

но это не соответствует вашему выводу. Честно говоря, ваш пример вывода не имеет смысла для меня.

Есть только одна строка для Area1, но почтовые индексы не являются смежными. Для Area2 есть две строки, но у каждой есть один почтовый индекс. Для Area3 есть две строки, но ZIP не являются смежными.

Подождите. , .

Означает ли смежные , что вы вставили пустую строку между операторами INSERT в данных примера?

Если это так, то вам нужно хранить больше данных. Вы должны определить, какие почтовые индексы следует считать смежными, и сохранить эти факты в таблице. (Кроме того, вы пропустили пустую строку в Area2.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...