2016-11-14 3 views
-1

Таблица площадейSql - Группировка данных

WBSNumber | SiteCode | ASNumber | SiteName

1 .......................... 11112 ........... 1 ..... ............ SiteA

1 ........................ 11112 .......... 2 ................ SiteA

2 ................. ........ 42342 .......... 2 ............... SiteB

2 ......... ................ 42342 .......... 1 ............... SiteB

2. ................................ 42342 .......... 3 .............. . SiteB

3 ......................... 78965 .......... 1 ...... ......... SiteC

4 ......................... 78954 ......... 1 ............... Si teD

5 ......................... 112233 .......... 1 ....... ........ SiteE

5 ......................... 112233 .......... 2 ............... SiteE

Я изо всех сил пытаюсь написать некоторые sql, которые вернут список всех сайтов с уникальным WBSNumber, основанным на самом высоком ASNumber.

Так что в моем случае, я жду следующие результаты обратно:

WBSNumber | SiteCode | ASNumber | SiteName

1 ........................ 11112 .......... 2 ................ SiteA

2 ................. ........ 42342 .......... 3 ............... SiteB

3 ......... ................ 78965 .......... 1 ............... SiteC

4. ........................ 78954 .......... 1 .............. . SiteD

5 ......................... 112233 .......... 2 ...... ......... SiteE

Здесь WBSNumber уникален и выбирает только строки, основанные на hest ASNUmber.

+2

Можете ли вы отформатировать это лучше и сделать более очевидным, что ваш вопрос? –

+0

Также покажите нам, что вы пробовали до сих пор –

ответ

3

Попробуйте это:

SELECT WBSNumber, SiteCode, MAX(ASNumber) ASNumber, SiteName 
FROM SiteTable 
GROUP BY WBSNumber, SiteCode, SiteName 

MAX используется, чтобы получить самую высокую ASNumber, и другие столбцы должны быть включены в GROUP BY п

+0

Не должно быть 'MAX (ASNumber) как« ASNumber »или« MAX (ASNumber) «ASNumber» вместо «MAX (ASNumber) ASNumber'? – Angelo

+2

'as' не требуется, равно как и одиночные кавычки апострофа. Совершенно действительное решение. если siteCode и SiteName всегда одинаковы для данного WBSNumber. – xQbert

+0

Вам не нужно использовать кавычки для псевдонима в SQL Server, только если у вас есть пробел в псевдониме типа «AS Number», –

0

Вы можете использовать аналитическую назначить RowNumber (начиная с 1 увеличивается на один) для каждого wbsnumber для самого высокого ASnumber, а затем выберите RowNumber 1 ...

with cte as 
(Select s.*, Row_number() over (partition by wbsNumber order by asNumber desc) RN) 
Select * from cte 
where RN = 1 

или до аналитики ... Мы генерируем набор данных для максимального ASnumber для каждого WBSNumber и просто позволяем внутреннему соединению исключать все остальные записи.

SELECT s.* 
FROM Site S 
INNER JOIN (SELECT Max(ASNumber) mASNumber, WBSNumber From site Group by WBSNumber) S2 
on S.WBSNumber = S2.WBSNumber 
and S.ASNumber = S2.mASNumber 

Этот подход обеспечивает сохранение всех остальных данных в таблице; поэтому, если у вас было другое имя сайта для самого высокого ASNumber, мы получили бы только имя для самого высокого ASnumber.

0

Основываясь на ваших данных образца, WBS, SiteCode и SiteName являются уникальными друг для друга. Так что вам просто нужно максимальное ASNnumber

select distinct 
    WBSNumber, 
    SiteCode, 
    SiteName, 
    Max(ASNumber) as ASNumber 
from SiteTable 
group by 
    WBSNumber, 
    SiteCode, 
    SiteName 

Если это не так, вы можете просто получить максимальную WBS, а также ...

select distinct 
    Max(WBSNumber) as WBSnumber, 
    SiteCode, 
    SiteName, 
    Max(ASNumber) as ASNumber 
from SiteTable 
group by 
    SiteCode, 
    SiteName 

В противном случае нам нужен больший образец данных ... или использование RowNumber()

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