SQL - Получение большего количества данных с помощью GROUP BY - PullRequest
0 голосов
/ 14 апреля 2009

Надеясь, что кто-то может помочь мне с этим.

Допустим, у меня есть таблица с именем input_data с 4 столбцами:

primary_key_id
serial_number
counter
selected_color

Я получаю данные из источника, который заполняет эту таблицу. Первичный ключ имеет свою идентичность включен, чтобы он не повторялся. Я получу дубликаты серийных номеров с разными выбранными цветами.

Счетчик постоянно увеличивается с устройства.

Так что я хочу сделать, это выбрать все данные, которые я получил сегодня, сгруппировать данные по серийному номеру и получить только запись с наибольшим значением счетчика.

Simple:

SELECT      serial_number, MAX(counter)
FROM        incoming_data 
GROUP BY    serial number

Это работает отлично, за исключением того, что я хочу сделать что-то с информацией о цвете что я получил.

Если я добавлю цвет к выделенному, то получу ВСЕ записи, так как все цвета, которые я получил в тот день, разные. Это не сработает.

Если бы я мог получить primary_key_id записи, тогда я мог бы просто запросить цвет, но это не работает, так как каждый primary_key_id ценность отличается, я получаю их всех.

Какие-нибудь предложения по лучшей технике для этого?

Спасибо!

Ответы [ 5 ]

2 голосов
/ 14 апреля 2009

Извлеките соответствующий ключ, затем присоединитесь, чтобы получить «не ключ». Это работает в MS SQL Server и более поздних версиях Sybase.

SELECT 
    i.serial_number, i.counter, i.selected_color
FROM
   (
   SELECT      serial_number, MAX(counter) AS maxc
   FROM            incoming_data 
   GROUP BY    serial number
   ) max
   JOIN
   incoming_data i ON max.serial_number = i.serial_number AND max.maxc = i.counter
1 голос
/ 14 апреля 2009

РЕДАКТИРОВАТЬ: работает со случаями, когда несколько записей имеют одинаковый серийный номер и максимальное значение счетчика. Это извлечет один из этих кратных с наибольшим primary_key_id

   Select * From incoming_data 
    Where primary_key_id In 
       (Select Max(primary_key_id) From incoming_data I
        Where Counter = 
              (Select Max(counter) From incoming_data 
               Where SerialNumber = I.SerialNumber)
        Group By SerialNumber)
0 голосов
/ 17 ноября 2009

Я пытаюсь получить максимальные числа из двух соединенных таблиц. Я пытался использовать DISTINCT, чтобы избежать повторяющихся чисел, но не получилось. Затем я нашел следующий запрос и отлично работает с одной таблицей, но мне не удалось его скомбинировать с двумя таблицами.

Как реализовать следующий запрос в моем запросе: выберите топ 10 ПотреблениеKWH из периодических предположений группировка по потреблениюKWH заказ по мин. (ПотреблениеKWH) asc

Требуется на:

"ВЫБРАТЬ * ИЗ" & _ "(ВЫБЕРИТЕ Отдельные топ 10" & _ "PeriodicConsumptions.ConsitationKWH," & _ "MeterReadings.MeterNo" & _ "MeterReadings.LastKWH," & _ "MeterReadings.AccountNo" & _ "MeterReadings.MultiplyFactor" & _ "MeterReadings.LastReading" & _ "MeterReadings.ThisMonthReading" & _ "MeterReadings.NumberofDays" & _ "MeterReadings.ReadingGYear" & _ "MeterReadings.ReadingGMonth" & _ "MeterReadings.ReadingDate" & _ "ИЗ СЧЕТЧИКОВ, ПЕРИОДИЧЕСКИЕ РАСЧЕТЫ" & _ "Where MeterReadings.AccountNo = PeriodicConsumptions.AccountNo" & _ "and MeterReadings.ReadingGYear = PeriodicConsumptions.ConsumpYear" & _ "and MeterReadings.ReadingGMonth = PeriodicConsumptions.ConsumpMonth" & _ "and MeterReadings.ReadingDate = PeriodicConsumptions.FromDate" & _ "ORDER BY PeriodicConsumptions.ConsitationKWH desc) как t" & _ "ПОРЯДОК ПОТРЕБЛЕНИЯ KWH asc"

Спасибо

0 голосов
/ 14 апреля 2009

Если вам не нужен точный цвет из запроса, но вы можете разобрать его потом, попробуйте следующее:

SELECT      serial_number, MAX(counter), MAX( CONCAT(counter, ':', selected_color) )
FROM            incoming_data 
GROUP BY    serial number
0 голосов
/ 14 апреля 2009

Привет, я думаю, что это может сделать то, что вы хотите?

SELECT selected_color, serial_number, counter FROM incoming_data GROUP BY serial_number ORDER BY counter DESC LIMIT 1;

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