1

たとえば、データベースに POSTGRESQL または MYSQL のようなテーブルがあるとします:-

video_clip_name | bad | so_so | good|
video 1         | 20  | 13    | 3   |
video 2         | 12  | 20    | 33  |
video 3         | 40  | 34    | 33  |
video 4         | 20  | 23    | 13  |
video 5         | 20  | 13    | 37  |

3 つの列 (bad、so_so、good) を比較した後、最高スコアに基づいて、どのビデオが悪い、so_so、または良いと評価されているかを判断したいと考えています。たとえば、ビデオ 1 の評価が他の 2 つの列よりも高く、悪い評価が付けられているとします。これは、ビデオ 1 が悪いと評価されたことを意味します。

私の質問は、POSTGRESQL/MYSQL でそのような SQL ステートメントを記述して、3 つの列の値の比較に基づいて各ビデオの総合評価を出力する方法です。

ありがとうございました

4

4 に答える 4

3

私はMySQL側から来ましたが、Postgresでも次のことが機能するはずです。

SELECT video_clip_name, CASE GREATEST(bad, so_so, good)
   WHEN bad   THEN 'bad'
   WHEN so_so THEN 'so_so'
   WHEN good  THEN 'good'
END AS rating
FROM table;

ただし、動画の最高の評価スコアが複数の評価に表示された場合にどうなるかを定義していません(例:bad= 40、so_so= 20、good= 40)。このような場合、上記のコードは常にCASE(つまりbad、よりも優先して)で最初に一致するものso_soを優先しgoodます。

于 2012-04-28T19:42:05.513 に答える
1

評価を収集する多くのサイトでは、受け取った評価に基づいてアイテムの全体的な人気を表す数値スコアを計算します。何らかの数値平均を計算しない限り、2 つ以上のアイテムの相対的な人気を比較することは困難です。Evan Miller によるこの記事は、計算の背後に統計的な厳密さを少し加えた SQL 式を適用するのに役立ちます。その中で、彼は次の問題ステートメントに対する良い解決策 (およびいくつかのあまり良くない解決策) を示しています。

あなたはウェブプログラマーです。ユーザーがいます。あなたのユーザーはあなたのサイトで何かを評価します。評価の高いものを一番上に、評価の低いものを一番下に配置します。並べ替えるには、ある種の「スコア」が必要です。

于 2012-04-28T19:57:56.163 に答える
0

mysqlまたはpostgresqlの構文の詳細についてはよくわかりませんが、私には、次のような一連のifステートメントのように見えます。

if bad > so_so then
  if bad > good then 'bad'
  else 'good'
  end if
else if so_so > good then 'so so'
else 'good'
end if 

もちろん、その周りを正しく選択する必要があります。これは、ビデオテープごとに1行しかないことを前提としています。

于 2012-04-28T19:46:34.370 に答える
0

式を使用した別の方法を次に示しCASEます。MySQL や PostGreSQL ではなく SQL Server を使用していますが、これは ANSI SQL に準拠していると思います。サンプル データと出力では、さまざまな値が使用されます。ただし、それらがすべて等しい場合、現在、評価はbad、 *so_so* 、goodの順に選択されます。

スクリプト:

CREATE TABLE dbo.VideoRatings 
(
        video_clip_name VARCHAR(10) NOT NULL
    ,   bad             INT         NOT NULL
    ,   so_so           INT         NOT NULL
    ,   good            INT         NOT NULL
);

INSERT INTO  dbo.VideoRatings (video_clip_name, bad, so_so, good) VALUES
    ('video a', 1, 2, 3),
    ('video b', 2, 3, 1),
    ('video c', 3, 2, 1),
    ('video d', 2, 1, 1),
    ('video e', 1, 2, 2),
    ('video f', 1, 1, 2),
    ('video g', 2, 2, 2);

SELECT  video_clip_name
    ,   CASE 
            WHEN bad    >= so_so    AND bad     >= good     THEN 'bad'
            WHEN so_so  >= bad      AND so_so   >= good     THEN 'so_so'
            WHEN good   >= bad      AND good    >= so_so    THEN 'good'
        END AS Rating
FROM    dbo.VideoRatings;

出力:

video_clip_name rating
--------------- ------
video a         good
video b         so_so
video c         bad
video d         bad
video e         so_so
video f         good
video g         bad
于 2012-04-28T19:50:51.963 に答える