3

私はこのSQL文を持っています:

SELECT * FROM converts 
WHERE email='myemail@googlemail.com' AND status!='1' 
ORDER BY date ASC, priority DESC

これは日付順に並べるだけですが、列の「優先度」にもっと権限を与えたいと思います。これどうやってするの?

最初に日付順に並べる必要がありますが、2 つのレコード間の時間が 10 分である場合は、優先して引き継ぐ必要があります。SQL ステートメントでこれを行うにはどうすればよいですか、それともアプリケーション ロジックに含める必要がありますか? SQLステートメントでそれができることを望んでいました。

助けてくれてありがとう

4

5 に答える 5

5

「日付」の順序付けを 10 分のチャンクに量子化できるので、フロア (unix_timestamp(date)/600) で順序付けしてから、優先度で順序付けしてください。

SELECT * FROM converts 
WHERE email='myemail@googlemail.com' AND status!='1' 
ORDER BY floor(unix_timestamp(date)/600) ASC, priority DESC

2 つの日付の間隔が 10 分未満であっても、2 つの異なる 10 分間の「チャンク」にまたがることがあります。それで十分かもしれませんが、アプリケーションが要求したことを正確に実行する方がよいと思います。

(OPは拡張説明を要求しました....)

今日の 9:09 と 9:11 のように、10 分の境界にまたがる 2 つの時刻を考えてみましょう。

  • フロア (unix_timestamp('2009-03-16 09:09:00 ')/600) = 2061990
  • フロア (unix_timestamp('2009-03-16 09:11:00 ')/600) = 2061991

09:09 よりも 09:11 の優先度の高い行があるとします。2 分しか違わなかったとしても、次の 10 分のチャンクに含まれるため、09:09 の行の後に表示されます。

したがって、このアプローチは概算ですが、最初に述べたように問題を解決しません。

あなたが問題を述べたように、10分未満の間隔で連続した一連の優先度の低い行があった限り、優先度の高い行が数時間(または数日、または数か月)前に記録される前に表示される可能性があります。

于 2009-03-15T14:47:22.180 に答える
1

別のバリエーションは次のとおりです。

SELECT * FROM converts 
WHERE email='myemail@googlemail.com' AND status!='1' 
ORDER BY (unix_timestamp(date)/60) - priority 

あなたが必要としていたものとはまだ正確ではありませんが、かなり近いです。

于 2009-03-15T15:27:10.353 に答える
0

あなたが本当に「2 つのレコード間の時間は 10 分 [またはそれ以下] である」という意味であると仮定すると、優先順位を引き継ぎたいですか?

次に、10分単位で並べ替え、次に優先度順に並べ替えます...

選択 ...
Date で並べ替えるDiff(min, 0, Date) / 10, Priority

値 0 を調整して、各「tem-minute-block」の開始位置と停止位置を制御できます...MySql に DateDiff 関数がない場合は、参照時刻からの分数を提供する MySQL の任意の式を使用します...

于 2009-03-15T15:03:51.703 に答える
0

SQL Server 2005 / 2008 を使用している場合、再帰 CTE を使用してこのタスクを実行できます。このテキストはメモ帳に書いたものであり、まだテストされていないことに注意してください。クエリ結果をテストする機会があれば、エラーがあれば CTE を更新するか、このコメントを完全に削除します。

WITH date_cte

なので

(SELECT *
    , 'sequential_order' = ROW_NUMBER() OVER
        (PARTITION BY email
        ORDER BY date ASC, priority DESC)
FROM converts
WHERE email = 'myemail@googlemail.com'
AND status <> '1')

、recursive_date_cte

なので

(SELECT dc1.*
    , 'sort_level' = 1
FROM date_cte dc1
WHERE sequential_order = 1
UNION
SELECT dc1.*
    , 'sort_level' = CASE
        WHEN DATEDIFF(MINUTE, dc1.date, dc2.date) <= 10 THEN sort_level
        ELSE sort_level + 1 END
LEFT JOIN date_cte dc2
    ON dc1.sequential_order = dc2.sequential_order - 1
WHERE dc1.sequential_order > 1)

選択する *

FROM recursive_date_cte

ORDER BY sort_level ASC

, priority DESC
于 2009-03-15T15:27:58.073 に答える
-1

注文ステートメントの順序または列を変更するだけです

SELECT * FROM converts WHERE email='myemail@googlemail.com' AND status!='1' ORDER BY priority DESC, date ASC
于 2009-03-15T14:46:04.647 に答える