Возвратите минимальную дату и соответствующую сумму для этого отдельного идентификатора - PullRequest
2 голосов
/ 24 ноября 2011

Вторая половина дня

Я пытаюсь вернуть минимальное значение / максимальное значение в SQL Server 2005, когда у меня несколько одинаковых дат, но все значения в столбце Owed разные. Я уже отфильтровал таблицу с помощью оператора select во временную таблицу для другого запроса, а затем попытался отразить у меня все дублированные даты, которые вы видите ниже.

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

ID| Date   |Owes
-----------------
1  20110901 89
1  20110901 179
1  20110901 101
1  20110901 197 
1  20110901 510
2  20111001 10
2  20111001 211
2  20111001 214 
2  20111001 669

Мой текущий запрос:

Drop Table #Temp

Select Distinct Convert(Varchar(8), DateAdd(dd, Datediff(DD,0,DateDue),0),112)as Date
,ID
,Paid
Into #Temp
From Table
Where Paid <> '0'

Select ,Id           
       ,Date
       ,Max(Owed)
       ,Min(Owed)          

From #Temp
Group by ID, Date, Paid
Order By ID, Date, Paid

Это не удаляет ни одну из моих дат, которые совпадают, я новичок в SQL, но я предполагаю его, потому что мой столбец owed имеет другие значения. Я в основном хочу иметь возможность отозвать первую запись, так как это всегда будет моя минимальная выплата, а моя последняя запись всегда будет моей максимальной задолженностью, чтобы вычислить мою общую задолженность по ID.

Я новичок в SQL, поэтому хотел бы понять, что я сделал не так для моего будущего знания структурирования запросов?

Большое спасибо

Ответы [ 2 ]

2 голосов
/ 24 ноября 2011

В вашем утверждении "выбрать в" у вас нет столбца Owed?

GROUP BY - это обычный способ «вырезать одинаковые значения». Если вы сгруппируете по ID и дате, вы получите одну строку в вашем результате для каждой отдельной пары значений в этих двух столбцах. Каждая строка в результатах представляет ВСЕ строки в базовой таблице, а агрегатные функции, такие как MIN, MAX и т. Д., Могут извлекать значения.

SELECT id, date, MAX(owes) as MaxOwes, MIN(owes) as minOwes
FROM myFavoriteTable
GROUP BY id, date

В SQL Server 2005 есть «оконные функции», которые позволяют использовать агрегатные функции для групп записей без группировки. Пример ниже. Вы получите одну строку для каждой строки в таблице:

 SELECT id, date, owes, 
 MAX(Owes) over (PARTITION BY  select, id) AS MaxOwes,
 MIN(Owes) over (PARTITION BY select, id) AS MinOwes
 FROM myfavoriteTable

Если вы назовете столбец "MinOwes", это может звучать так, будто вы просто ловите рыбу.

1 голос
/ 24 ноября 2011

Если вы хотите сгруппировать по дате, вы также не можете сгруппировать по ID, потому что ID, вероятно, уникально.Попробуйте:

Select ,Date
       ,Min(Owed) AS min_date
       ,Max(Owed) AS max_date
From #Temp
Group by Date
Order By Date

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

SELECT DISTINCT
      ,Date
      ,first_value(ID)   OVER (PARTITION BY Date ORDER BY Owed) AS min_owed_ID
      ,last_value(ID)    OVER (PARTITION BY Date ORDER BY Owed) AS max_owed_ID
      ,first_value(Owed) OVER (PARTITION BY Date ORDER BY Owed) AS min_owed
      ,last_value(Owed)  OVER (PARTITION BY Date ORDER BY Owed) AS max_owed
FROM   #Temp
ORDER  BY Date;
...