2011-03-15 61 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 
)