Счетчик, ограничивающий строки, возвращаемые оператором select - PullRequest
0 голосов
/ 15 марта 2011

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

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

EDIT:

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

Я хочу получить 10 первых разговоров вместе с их последним сообщением и временем. Я хочу, чтобы sql тоже получал приглашенных в беседе (я делаю это, добавляя строки с одинаковым разговорным идентификатором latestMessage и временем вместе с различными значениями profileId. Позднее я группирую приглашенных для каждого разговора в коде JAVA). У меня есть одна таблица под названием dialog_invited и другая таблица под названием сообщения разговора. В таблице journal_messages у меня есть такие столбцы, как dialogId, profileId, messageBody, timeStamp и т. Д. А в таблице journal_invited только столбец dialogId и 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 для получения приглашен в разговор тоже (я делаю это путем добавления строк с одинаковыми Разговор был последним сообщением и временем наряду с различными значениями ProfileID. Я группирую приглашенных к каждому разговор в коде JAVA позже)

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

Ответы [ 5 ]

0 голосов
/ 15 марта 2011

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

select title, date
from yourtable
where date in (
    select distinct date
    from yourtable
    order by date asc
    limit 10
)
0 голосов
/ 15 марта 2011

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

0 голосов
/ 15 марта 2011

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

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

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
0 голосов
/ 15 марта 2011
SELECT title, COUNT(DISTINCT date) AS nb
FROM myTable
GROUP BY title
HAVING nb > 10
LIMIT 10
0 голосов
/ 15 марта 2011

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

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