質問

次のSQLステートメントがあります:

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

これは日付順に注文するだけですが、列に「優先度」を付けたいと思います。より多くの権限。これどうやってするの?

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

ご協力ありがとうございました

役に立ちましたか?

解決

「日付」の順序付けを10分のチャンクに量子化できます。そのため、floor(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回撮ります:

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

09:11よりも09:11の優先度の高い行がある場合、次の10分チャンクに落ちたため、09:09行のに表示されますわずか2分違います。

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

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

他のヒント

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

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

必要なものではありませんが、かなり近いです。

あなたが本当に2つのレコード間の時間が10分(またはそれ以下)であると仮定した場合、優先度を引き継ぎたいですか?

その後、10分ブロックで並べ替えてから、優先度で並べ替えます...

選択...
DateDiffによる注文(最小、0、日付)/ 10、優先度

0の値を調整して、各「tem-minute-block」の場所を制御できます。開始および停止... MySqlにDateDiff関数がない場合は、MySQLで任意の参照時刻からの分数をカウントする式を使用します...

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

date_cteと

AS

(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

AS

(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

sort_level ASCによるORDER

, priority DESC

orderステートメントの列の順序を変更するだけ

SELECT * FROM converts WHERE email='myemail@googlemail.com' AND status!='1' ORDER BY priority DESC, date ASC
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top