2011-03-15 10 views
0

私はかなり複雑なselect文を持っています。しかし、私は列を持って、日付とタイトルと呼ばれる列を持っている、その後、私はカウンタが10に私はSQL文が欲しいときに、結果セットで毎日カウントするカウンタ(それは、日付が等しい前の日付でない場合は増分したい)最初の10日間の結果セットを返します。select文で返される行を制限するカウンタ

日付はちょうど私の問題の類推です。重要な部分は私のカウンターです。

EDIT:

ここでは私の本当の問題である:

私は彼らの最新のメッセージと、時間とともに10最初の会話を取得したいです。私はsqlが会話の中で招待されたものを取得するようにしたい(私は同じconversationId latestMessageとtimeを持つ行をprofileIdの別の値と共に追加することによってこれを行う。私は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:私は私のクエリでグループ文を削除した 。私は上記の1つの問題があり、それは列の値のどれもが互いに異なっていないということです。私が言ったように:

は、彼らの最新のメッセージと 時間とともに10最初の会話 を取得したいです。私は、SQLが(後でJavaコード内の各 会話に招待 のプロファイルIDの異なる値と一緒に同じ はconversationId latestMessageと時間 で行を追加することによって、私は これ。Iグループ) あまりにも会話に招待を取得したいです

しかし、profileIdは区別されません(各会話では区別されますが、ユーザーは多くの会話に招待できます)。質問は、どうやって簡単な方法で常に異なる値を持つ列を追加できますか?私はカウンターをグループ化することができるように?

+1

どのようなデータベースですか?違いがあります。たとえば、MySQLではLIMITを使用し、SQL ServerではTOPを使用します。 –

+0

woho - いくつかのサンプル行と期待される結果をリストしてください。 – RichardTheKiwi

答えて

0

LIMITと組み合わせてGROUP BYDISTINCTの式を見てください。あなたはあなたが好きな日付を見つけるためにこれらを使用することができるはずです。それらをサブクエリとして使用して、好きな行を取得する必要があるかもしれません(多分、他の誰かが一度にすべてをやる方法を見つけ出すでしょうか?

0

もう少し堅実な情報なしでは非常に良い答えが得られませんが、トップ10のユニークな日付を選択し、それらの日付をメインのクエリに結合して、結果を返すことができますか?

私はのようなものを考えています。Oracleで

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

もう1つ問題がありますが、タイトルが同じ場合もあります。しかし、それを解決する方法は? – einstein

0

、あなたは価値分析を行ごとに、このタイプのを許可しLEADとLAGウィンドウ関数を取得します。

0

最初の10日間のすべてのタイトルが必要ですか?

select title, date 
from yourtable 
where date in (
    select distinct date 
    from yourtable 
    order by date asc 
    limit 10 
) 
関連する問題