2011-03-15 62 views
0

我有一个相当复杂的select语句。然而,我有一个列,比如说日期和一个名为title的列,然后我想要一个计数器(如果日期与前一个日期不相等,则递增),计数结果集中的每一天,当计数器达到10时我希望SQL语句返回10个第一个日期的结果集。限制select语句返回的行的计数器

日期只是我的问题的类比;重要的部分是我的柜台。

编辑:

这是我真正的问题:

我想与他们的最新消息和时间相处了10第一次谈话。我希望sql也检索对话中的邀请(我通过添加具有相同conversationId latestMessage的行以及具有不同的profileId值的时间来完成此操作,之后我将这些邀请分组到JAVA代码中)。我有一个名为conversation_invited的表,另一个表称为会话消息。在表conversation_messages中,我有像conversationId,profileId,messageBody,timeStamp等列。并在表conversation_invited列中conversationId和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检索邀请 在交谈过(我做 这被后来与 简档,我组的邀请在Java代码中的每个 谈话的不同值一起添加具有相同 的conversationId latestMessage行时间 )

但是profileId也不是很明显(我的意思是在每个对话中都是不同的,但用户可以被邀请参加很多对话)。问题是如何以简单的方式添加总是有不同值的列?所以我可以把柜台分组?

+1

什么数据库?你知道有差异。例如,在MySQL中你会使用LIMIT,而在SQL Server中你使用TOP。 – 2011-03-15 01:54:42

+0

woho - 你能列出一些示例行和预期结果吗? – RichardTheKiwi 2011-03-15 02:25:53

回答

0

GROUP BYDISTINCT表达式(连同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 2011-03-15 02:01:42

+0

COUNT(DISTINCT日期)= *如果日期不等于上一次日期,则会递增* – 2011-03-15 02:03:02

+0

我又遇到了一个问题,在某些情况下标题相同,否则我认为它会起作用。但如何解决它? – einstein 2011-03-15 02:18:46

0
在甲骨文

,你会得到超前和滞后窗口功能,让这种类型的行以行值分析。

0

你想要前10个日期的所有标题?

select title, date 
from yourtable 
where date in (
    select distinct date 
    from yourtable 
    order by date asc 
    limit 10 
)