SQL、並べ替え-他の列により多くの権限を与える方法
-
22-07-2019 - |
質問
次の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