ВЫБЕРИТЕ DISTINCT в одном столбце, верните несколько других столбцов (SQL Server)

Если у вас установлен phpMyAdmin, используйте его функцию «Поиск».

  • Выберите свой DB
  • Убедитесь, что вы выбрали БД (т. е. не таблицу, иначе вы получите совершенно другое диалоговое окно поиска)
  • Нажмите вкладку «Поиск»
  • Выберите поисковый запрос, который вы хотите
  • Выберите таблицы для поиска

Я использовал это до 250 табличных / 10 ГБ баз данных (на быстром сервере), а время отклика - не что иное, как удивительное.

18
задан marc_s 23 November 2009 в 20:27
поделиться

5 ответов

SELECT * FROM
GPSReport AS G1
JOIN (SELECT device_serial, max(datetime) as mostrecent 
      FROM GPSReport group by device_serial) AS G2
ON G2.device_serial = G1.device_serial and g2.mostrecent = g1.datetime
ORDER BY G1.device_serial
16
ответ дан 30 November 2019 в 06:39
поделиться

У вас правильное соединение, поэтому, если у вас есть более одной записи для серийного номера устройства в таблице GPSReport , он получит все эти записи и объединит их с уникальный список, полученный от SELECT DISTINCT device_serial FROM GPSReport .

2
ответ дан 30 November 2019 в 06:39
поделиться

попробуйте:

   Select r.*   
   From GPSReport r
   Where datetime =
        (Select Max(DateTime)
         From GPSReport 
         Where device_serial = r.device_serial)
1
ответ дан 30 November 2019 в 06:39
поделиться

Как насчет чего-то вроде этого - поскольку я не мог запустить его, я полагаю, что мой synatx не идеален

select *
  from (
    select device_serial, [datetime], triggerID, latitude, longitude, speed, [address],
        ROW_NUMBER() over (partition by device_serial order by device_serial asc, [datetime] desc) as row
      from gpsreport
  ) as data
  where row = 1

Вам может потребоваться изменить предложение order by, чтобы выбрать предпочтительную запись, если есть кратны тем же device_serial и datetime

1
ответ дан 30 November 2019 в 06:39
поделиться

Я бы сделал это с помощью общего табличного выражения (CTE), например:

With ResultTable (RowNumber
                 ,device_serial
                 ,datetime
                 ,triggerID
                 ,latitude
                 ,longitude
                 ,speed
                 ,address)
AS
(
    SELECT Row_Number() OVER (PARTITION BY device_serial
                                  ORDER BY datetime DESC)
          ,device_serial
          ,datetime
          ,triggerID
          ,latitude
          ,longitude
          ,speed
          ,address
      FROM GPSReport
)
    SELECT device_serial
          ,datetime
          ,triggerID
          ,latitude
          ,longitude
          ,speed
          ,address
      FROM ResultTable
     WHERE RowNumber = 1
1
ответ дан 30 November 2019 в 06:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: