выберите 10 строк в день с заказом - PullRequest
4 голосов
/ 18 июля 2009

У меня есть БД с записями с датой (отметка времени) Мне нужно выбрать 10 записей для каждого дня (есть еще много в день) и упорядочить их по нескольким столбцам ...

как должен выглядеть этот запрос?

Ответы [ 9 ]

4 голосов
/ 18 июля 2009

Вы должны получать свои 10 записей в день в подзапросе на каждый день и присоединять их к основной таблице с помощью левого соединения, так что вы получите максимум 10 записей в день. SQL будет выглядеть так:

SELECT t1.columns
FROM mytable t1 
  LEFT JOIN 
     (SELECT pk FROM mytable t2 
     WHERE t2.datecol = t1.datecol 
     ORDER BY t2.orderFor10Rows LIMIT 10) t3
  ON t1.pk = t3.pk
ORDER BY t1.anyOtherColumns

Нет гарантии на правильный синтаксис MySQL, так как я к этому не привык.

3 голосов
/ 12 марта 2012

Чтобы выбрать 10 лучших записей для каждого дня, упорядоченного по дням в SQL Server 2005

select * from 
(select *,ROW_NUMBER()
OVER
(PARTITION BY record.day order by record.day desc,record.score desc)
as row from record) 
as table1 where row < 11

Теперь, поскольку ваша таблица записей не имеет столбца дня как такового, вам нужно использовать что-то вроде datepart(day, record.date) вместо record.day

Это должно решить вашу проблему

2 голосов
/ 24 июля 2009

Если вы работаете с языком программирования и не обращаетесь напрямую к серверу, вы можете динамически создать запрос на объединение «Предела 10» или «Топ-10» для каждого дня. Не невероятно эффективный, но он по крайней мере будет работать, и его будет легче отлаживать и модифицировать позже. Вы даже можете создать запрос динамически через SP на сервере и работать прямо оттуда.

2 голосов
/ 18 июля 2009

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

SELECT whatever
  FROM tablename
  WHERE datecol = '2009-07-13'
  LIMIT 10

Это даст вам десять строк. Это до MySQL, который десять. Вы можете использовать ORDER BY или дополнительные WHERE элементы, чтобы выбрать определенную 10. Например, вот самая последняя 10:

SELECT whatever
  FROM tablename
  WHERE datecol = '2009-07-13'
  ORDER BY timecol DESC
  LIMIT 10

LIMIT задокументировано как часть синтаксиса SELECT .

1 голос
/ 04 апреля 2017

старый вопрос, но я нашел великолепный ответ (не мой), используя переменные сеанса.

Учитывая таблицу

CREATE TABLE `report` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`reportDate` int(11) DEFAULT NULL,
`count` int(11) DEFAULT NULL,
`parameter` varchar(100) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `INDEX1` (`reportDate`,`parameter`,`count`)
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8;

Следующий запрос выберет 10 лучших параметров в день на основе их количества в этот день

SELECT parameter, reportDate, count
FROM
    (SELECT parameter, 
             reportDate, 
             count, 
             @reportDate_rank := IF(@current_reportDate = reportDate,@reportDate_rank + 1, 1) AS reportDate_rank,
             @current_reportDate := reportDate 
    FROM report
    ORDER BY reportDate, count DESC
    ) dateRanked
WHERE reportDate_rank <= 10;
1 голос
/ 19 мая 2012

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

Здесь мы предполагаем, что в таблице «Записи» имеется поле «дата-время» и поле оценки для ранжирования записей.

SELECT      *
FROM            (SELECT *, ROW_NUMBER() OVER (PARTITION BY datepart(year, Record.date), datepart(month, Record.date), datepart(day, Record.date)
ORDER BY Record.score desc) AS row
FROM            Record ) AS table1
WHERE        row < 11
ORDER BY datepart(year, Record.date) desc, datepart(month, Record.date) desc, datepart(day, Record.date) desc
1 голос
/ 19 июля 2009

После просмотра (когда-либо превосходного) блога xaprb от Барона Шварца, http://www.xaprb.com/blog/2006/12/02/how-to-number-rows-in-mysql/ Интересно, может ли здесь работать использование пользовательских переменных.

select hiredate, ename, sal
from ( select hiredate, ename, sal,
       @num := if(@hiredate = hiredate, @num + 1, 1) as row_number,
       @hiredate := hiredate as dummy
     from emp_temp
) as x
where row_number < 3
order by hiredate, ename, sal

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

1 голос
/ 18 июля 2009

Вот возможное решение, но оно потребует небольшой работы за пределами sql. Это из живого примера списка фильмов. Все, что вам нужно сделать после этого - вытащить первые 10 фильмов из объединенного списка.

SELECT Movie_Release_Year, GROUP_CONCAT( Movie_Title
ORDER BY Movie_Title ) 
FROM movies
GROUP BY Movie_Release_Year

см. Group Concat для более подробной информации

1 голос
/ 18 июля 2009

Если вы работаете с MySQL, и столбец имеет тип timestamp. Вам необходимо преобразовать его в дату, а затем сравнить с датой, с которой вы хотите сравнить.

SELECT * FROM tablename tName

, где

Дата (timestampFieldName) = Дата ('2009-07-08')

предел 0,10

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