3

たとえば、クエリから行の最後の1 / x部分を、特定の方法で並べ替えて選択したいと思います。これどうやってするの?

私は次のようなものを思いついた

SELECT avg(smilies_count)
FROM posts AS p
WHERE time >= (???) -- I only want the last 25% of posts in this thread
GROUP BY thread_id; -- each thread can have more than 1 post, but I still only
                    -- want to consider the last 25% of posts in my average

でも、何を入れるかわからないので???、極端にぎこちない表現にはなりません。

編集

入れてみました

SELECT min(p2.time)
FROM posts AS p2
WHERE p2.thread_id = p.thread_id
ORDER BY p2.time DESC
LIMIT count(*) / 4

???、しかしそれは私にだけ与えた

Error: misuse of aggregate function count()
4

2 に答える 2

2

基本的に、すべてのスレッドからの最後の投稿の25%が必要であり、後の操作はあなた次第だと思います。

私が正しければ、このコードはあなたのために働くはずです(MS-SQL用に書かれていて、SQLiteに簡単に移植できるはずです):

CREATE TABLE posts (
    post_id INT,
    thread_id INT
)

INSERT INTO posts(post_id, thread_id) VALUES (1, 1)
INSERT INTO posts(post_id, thread_id) VALUES (2, 2)
INSERT INTO posts(post_id, thread_id) VALUES (3, 2)
INSERT INTO posts(post_id, thread_id) VALUES (4, 3)
INSERT INTO posts(post_id, thread_id) VALUES (5, 3)
INSERT INTO posts(post_id, thread_id) VALUES (6, 3)
INSERT INTO posts(post_id, thread_id) VALUES (7, 3)
INSERT INTO posts(post_id, thread_id) VALUES (8, 3)
INSERT INTO posts(post_id, thread_id) VALUES (9, 3)
INSERT INTO posts(post_id, thread_id) VALUES (10, 3)
INSERT INTO posts(post_id, thread_id) VALUES (11, 3)

SELECT src.*
FROM (
    SELECT post_number = (
        SELECT 1 + COUNT(*)
        FROM posts pp 
        WHERE p.post_id > pp.post_id 
        AND p.thread_id = pp.thread_id
    ), 
    post_id,
    thread_id
    FROM posts p
) src
JOIN (
    SELECT thread_id, cnt = COUNT(*)
    FROM posts
    GROUP BY thread_id
) counts
ON src.thread_id = counts.thread_id
WHERE (CONVERT(FLOAT, src.post_number) / CONVERT(FLOAT, counts.cnt)) >= 0.75

主にpost_numberを取得するサブクエリが原因で、パフォーマンスの高いクエリではないことに注意してください。それをサポートするDBMSにとっては、OVER句を使用してはるかに優れた方法で記述できます。

于 2012-11-08T23:12:23.047 に答える
-1

これは、投稿全体の最後の25%が必要な場合のバージョンです。

select
  avg(1.0 * smilies_count) avg_count,
from (select top 25% * from posts order by time desc) last_posts

そして、これはすべてのスレッドの投稿の最後の25%にもう1つあります。

select
  avg(1.0 * smilies_count) avg_smilies
from (
  select
    thread_id, post_id, smilies_count,
    row_number() over (partition by thread_id order_by time desc) row_num
  from posts
) p
join (select thread_id, count(*) cnt from posts group by thread_id) c on
  p.thread_id = c.thread_id
where
  p.row_num < 0.25 * c.cnt
group by
  p.thread_id
于 2012-11-08T23:11:55.890 に答える