2012-04-25 4 views
1

Можно создать дубликат:
Selecting the Highest Seq Number by nested JoiningSQL Номер таблицы высокой последовательности

Здравствуйте, я должен написать запрос, я хотел бы взять наибольший порядковый номер для каждого идентификатора клиента (большой порядковый номер будет рассчитываться на основе самого высокого остатка на банковском счете).

Примите во внимание, что эта таблица имеет 100000 записей.

таблица вроде как ценам ниже

Таблица:

 
**ClID**  **SeqNu**  **Bal** 
1     1    30000 
1     2    26789 
1     3    23456 
1     4    12345 
1     5    21234 
2     3    12456 
2     4    45632 
2     1    23456 
2     9    99999 
3     4    12345 
3     5    21234 
3     3    12456 
3     4    45632 

Результат будет

 
**ClID**  **SeqNu**   **Bal** 
1     1    30000 
2     9    99999 
3     4    45632 
+0

Это, возможно, было мое редактирование ... но я думаю, что ты прав – cjk

+1

Это звучит как вы хотите, чтобы высший 'Bal', а не' SeqNu' - правильно ли задан ваш вопрос? – RedFilter

+0

RedFileter, мне нужен самый высокий номер для клиента (основанный на максимальном балансе для этого идентификатора клиента) –

ответ

2

Лучший способ сделать это, вероятно, варьируются в зависимости от RDBMS вы используете. Если у вас есть оконные функции (Oracle 9i + или SQL Server 2012, например), должно работать:

select distinct ClId, 
       first_value(SeqNu) 
        over (partition by ClId 
          order by Bal desc) as SeqNu, 
       max(Bal) 
        over (partition by ClId) as Bal 
from your_table 
+0

@ Allan-выглядит, что-то разумное, позвольте мне попробовать это. –

+0

@Allen, Hha Да, я не могу использовать этот выше запрос, поскольку я работаю над 2008r2. Но согласно вашей логике запроса я мог бы достичь своего требования. Есть ли другой способ добиться моей проблемы? Спасибо. –

+0

Если вы не можете использовать функции окна, то ответ @ RedFilter - лучший подход. Обязательно выберите его в качестве ответа, если он решит вашу проблему. – Allan

2

Вы должны использовать GROUP BY:

SELECT SeqNu, MAX(Bal) 
FROM Table 
GROUP BY SeqNu 
+0

Это совершенно неправильно. Плакат хотел, чтобы 'SeqNu' ассоциировался с самым высоким' Bal' в каждой группе 'ClId'. Это дает самый высокий 'Bal' в каждом' SeqNu'. – Allan

+0

@Allan - вопрос был отредактирован, из оригинального сообщения я считаю, что он включал только SeqNu и Bal, отсюда и мой ответ. –

+0

@ DarrenDavies Если вы вернетесь и посмотрите на исходный вопрос, вы можете видеть, что на выходе всегда было 3 столбца, просто один заголовок столбца отсутствовал ... – RedFilter

0

Вам нужно сделать два вложенных MAX заявления, чтобы соответствовать все это:

SELECT a.ClID, MAX(b.SeqNu) as SeqNu, b.Balance 
FROM Table a 
JOIN (SELECT ClID, MAX(Balance) as Balance FROM Table GROUP BY ClID) b 
    ON a.ClID = b.ClID AND a.Balance = b.Balance 
GROUP BY a.ClID, b.SeqNu 
+0

Привет, cjk. В вашем вложенном запросе мы берем максимальное количество seququence для clientId, а затем в основном запросе мы подсчитываем баланс для этого. Я этого не делаю для случая 3 4 45632 –

+0

Я изменил MAX, который должен теперь работать ... – cjk

+0

cjk. Если в номере sequnce есть дубликаты записей, то ваш макс (seq) работает, мы должны возьмите номер sequnce на основе max (balance). Спасибо! –

4
select t.* 
from (
    select CIID, 
     MAX(Bal) as MaxBalance 
    from table 
    group by CIID 
    ) sm 
inner join table t on sm.CIID = t.CIID and sm.MaxBalance = t.Bal 

SQL Fiddle example here

+0

Если мы это сделаем, снова таблица t будет иметь разную последовательностьId, автоматически все последовательности идентификаторов появятся в результате. мы не можем фильтровать самый высокий идентификатор sequnce. Пожалуйста, учитывайте, что максимальный баланс может быть одинаковым для любых других комбинаций клиентов и sequnceID из 1000000records. Мы не можем дать неправильные результаты. Спасибо! –

+0

Предложение JOIN находится на CIID, а также MaxBalance, поэтому нет, вы не получите дубликатов других CIID для одного и того же MaxBalance. Вы можете получить дубликаты для тех же CIID и MaxBalance, хотя, если этот баланс происходит более одного раза для одного и того же CIID. Вы не указали, как выбрать, какой SeqNo вернется в этом случае, поэтому я возвращаю оба. Подробнее от вас = лучшие ответы от нас. – RedFilter

+0

@satish: этот запрос не использует самый высокий идентификатор последовательности. Он получает самый высокий баланс для каждого идентификатора клиента, а затем использует эти значения для поиска правильного идентификатора последовательности. Основываясь на моем чтении вашего вопроса, этот ответ правильный. – Allan

0
SELECT b1.* 
FROM balance b1 
LEFT JOIN balance b2 
ON (b1.clid = b2.clid AND b2.bal > b1.bal) 
WHERE b2.clid IS NULL; 

+------+-------+-------+ 
| clid | seqnu | bal | 
+------+-------+-------+ 
| 1 |  1 | 30000 | 
| 2 |  9 | 99999 | 
| 3 |  4 | 45632 | 
+------+-------+-------+ 
3 rows in set (0.00 sec) 
Смежные вопросы