2011-03-15 2 views
0

У меня есть оператор select, который довольно сложный. Тем не менее, у меня есть столбец, допустим, дата и столбец с названием title, тогда мне нужен счетчик (он увеличивается, если дата не равна предыдущей дате), которые подсчитывают каждый день в наборе результатов, когда счетчик достигает 10. Я хочу, чтобы оператор SQL чтобы вернуть набор результатов для 10 первых дат.Счетчик, который ограничивает строки, возвращаемые оператором select

Даты - это просто аналогия с моей проблемой; важная часть - мой счетчик.

EDIT:

Вот моя реальная проблема:

Я хочу, чтобы получить 10 первый разговор вместе со своим последним сообщением и времени. Я хочу, чтобы sql также получал приглашение в разговоре (я делаю это, добавляя строки с одинаковым тегом talkId lastMessage и временем вместе с различными значениями profileId. Я группирую приглашенных для каждого разговора в JAVA-коде позже). У меня есть одна таблица с именем convers_invited и другая таблица, называемая сообщениями разговора. В table_messages table у меня есть столбцы, такие как talkId, profileId, messageBody, timeStamp и т. Д. И в таблице chat_invited только column talkId и profileId.

SELECT M1.conversationId, M1.profileId, profiles.profileMiniature, profiles.firstName, profiles.lastName, M2.lastMessageTime, count(DISTINCT M2.lastMessageTime) AS nb, M3.messageBody AS lastMessage " + 
      "FROM conversation_invited AS M1 " + 
      "INNER JOIN (" + 
      "   SELECT conversationId, " + 
      "     max(timeStamp) AS lastMessageTime" + 
      "   FROM conversation_messages " + 
      "   WHERE conversationId in  (" + 
      "          SELECT conversationId" + 
      "          FROM conversation_invited " + 
      "          WHERE profileId = ? " + 
      "          ) " + 
      "   GROUP BY conversationId " + 
      "   ) AS M2 " + 
      "ON M1.conversationId = M2.conversationId " + 
      "LEFT JOIN conversation_messages AS M3 " + 
      "ON M2.lastMessageTime = M3.timeStamp " + 
      "INNER JOIN profiles " + 
      "ON profiles.profileId = M1.profileId " + 
      "WHERE M1.profileId <> ? " + 
        // WHICH COLUMN SHALL I GROUP WITH? 
      "HAVING nb < 10 " + 
      "ORDER BY M2.lastMessageTime DESC "; 

UPDATE: я удалил заявление группы в моем запросе. У меня одна проблема выше, и ни одно из значений в столбцах не отличается друг от друга. Как я уже сказал:

хотят получить 10 первый разговор вместе со своим последним сообщением и времени. Я хочу, чтобы SQL, чтобы получить пригласил в разговоре тоже (я это путь добавления строк с такими же conversationId latestMessage и времени наряду с различными значениями ProfileID. I группы предлагаются каждый разговора в JAVA коде позже)

Но profileId тоже не отличается (я имею в виду разные в каждом разговоре, но пользователю может быть предложено много разговоров). Вопрос в том, как я могу добавить столбец, который всегда имеет различные значения в простой форме? Чтобы я мог сгруппировать счетчик?

+1

В какой базе данных? Знаете, есть различия. Например, в MySQL вы должны использовать LIMIT, а в SQL Server вы используете TOP. –

+0

woho - можете ли вы рассказать о некоторых примерах строк и ожидаемом результате? – RichardTheKiwi

ответ

0

См. Формулы GROUP BY и DISTINCT (в сочетании с LIMIT). Вы можете использовать их для поиска нужных вам дат; вам может понадобиться использовать их в качестве подзапроса для извлечения строк, которые вам нравятся (может быть, кто-то еще выяснит, как это сделать за один раз, или, может быть, вы это сделаете!).

0

Трудно дать очень хороший ответ без дополнительной информации, но вы могли бы выбрать свои 10 лучших уникальных дат, а затем объединить эти даты в основной запрос, чтобы вернуть результаты, которые вы хотите?

Я думаю, что-то вроде:

with top_10_unique_dates as (
select top 10 distinct date from 
table_whatever 
where blah = blah 
order by something 
) 

select * from 
table_whatever 
where blah = blah 
inner join top_10_unique_dates 
on table_whatever.date = top_10_unique_dates.date 
-1
SELECT title, COUNT(DISTINCT date) AS nb 
FROM myTable 
GROUP BY title 
HAVING nb > 10 
LIMIT 10 
+0

Что такое счет (дата DISTINCT)? – einstein

+0

COUNT (DISTINCT date) = * он увеличивается, если дата не равна предыдущей дате * –

+0

У меня есть еще одна проблема, в некоторых случаях заголовок один и тот же, в противном случае я думаю, что это сработает. Но как его решить? – einstein

0

в Oracle, вы получаете Свинец и окна LAG функции, которые позволяют этот тип строки к строке анализа стоимости.

0

Вы хотите все названия для первых 10 дат?

select title, date 
from yourtable 
where date in (
    select distinct date 
    from yourtable 
    order by date asc 
    limit 10 
) 
Смежные вопросы