我需要根據邏輯找到不正確的行。
邏輯是:
如果孩子有排(我會打電話給第一排)
| merit | fruit | vegetable | | --------- | ----- | --------- | | behaviour | apple | cucumber |然后在有功德的那一排=詩和果=蘋果一定只有 蔬菜=黃瓜(黃瓜沒有別的字) (就是第二排)
| merit | fruit | vegetable | | ----- | ----- | --------- | | poem | apple | cucumber |第二行的 AND 時間間隔必須比第一行的時間早或晚 4 小時,作為正確示例:
| child_id | date | merit | fruit | vegetable | | --------- | --------------- | --------- | ----- | --------- | | 2 | 1/26/2022 16:00 | poem | apple | cucumber | | 2 | 1/26/2022 18:00 | behaviour | apple | cucumber |如我們所見,間隔為 4 小時
我有桌子:
| child_id | date | merit | fruit | vegetable |
| --------- | --------------- | ----------- | ------- | --------- |
| 1 | 1/27/2022 14:00 | behaviour | apple | cucumber |
| 1 | 1/27/2022 15:00 | poem | apple | carrot |
| 1 | 1/27/2022 17:00 | sleep | apple | ginger |
| 1 | 1/27/2022 20:00 | competition | berry | tomatoe |
| 2 | 1/26/2022 13:00 | sleep | apricot | tomatoe |
| 2 | 1/30/2022 13:00 | poem | apple | cucumber |
| 2 | 1/29/2022 13:00 | poem | apple | cucumber |
| 2 | 1/26/2022 16:00 | poem | apple | cucumber |
| 2 | 1/26/2022 18:00 | behaviour | apple | cucumber |
| 2 | 1/26/2022 19:00 | present | apple | broccoli |
| 3 | 1/25/2022 11:00 | present | orange | cucumber |
| 3 | 1/25/2022 13:00 | poem | apple | ginger |
| 3 | 1/25/2022 15:00 | behaviour | apple | cucumber |
| 4 | 1/26/2022 14:00 | behaviour | apple | cucumber |
| 4 | 1/27/2022 21:00 | poem | apple | carrot |
| 4 | 1/27/2022 15:00 | poem | apple | carrot |
| 4 | 1/27/2022 20:00 | sleep | apple | ginger |
| 4 | 1/27/2022 21:00 | competition | berry | tomatoe |
我期望的結果:
| child_id | date | merit | fruit | vegetable |
| --------- | --------------- | ----- | ----- | --------- |
| 1 | 1/27/2022 15:00 | poem | apple | carrot |
| 3 | 1/25/2022 13:00 | poem | apple | ginger |
我不知道如何按孩子找到這些行。我寫了這個 SQL 并卡住了:
select * from example_1 where merit in ('behaviour', 'poem')
我這里需要磁區嗎?
uj5u.com熱心網友回復:
在這種方法中,我們使用整理子查詢。頂部查詢 B 為所需結果定義資料的非連接限制。所以菜<>黃瓜和功=詩
Exists 確保定義了第一行的限制并且存在非匹配項的相關性。所以我們確保水果匹配,優點是“行為”,child_id 的匹配,并且日期的差異在 4 小時內。
DEMO-DB Fiddle UK
SELECT B.*
FROM table B
WHERE vegetable <> 'cucumber'
and merit = 'poem'
and exists (SELECT 1
FROM Table A
WHERE A.Fruit = B.Fruit
AND A.Child_id = B.Child_ID
AND A.merit = 'behaviour'
AND abs(Datediff(hour,A.Date,B.Date)) <=4)
給我們:
---------- ------------------------- ------- ------- -----------
| child_id | date | merit | fruit | vegetable |
---------- ------------------------- ------- ------- -----------
| 1 | 2022-01-27 15:00:00.000 | poem | apple | carrot |
| 3 | 2022-01-25 13:00:00.000 | poem | apple | ginger |
---------- ------------------------- ------- ------- -----------
uj5u.com熱心網友回復:
一種可能的解決方案是使用 LEFT OUTER JOIN 將表連接到自身,然后只接受表的連接版本回傳 null 的記錄:
SELECT e1.*
FROM example_1 e1
LEFT OUTER JOIN example_1 e2
ON e1.fruit = e2.fruit
AND e1.vegetable <> e2.vegetable
AND e2.date BETWEEN DATEADD(HOUR, -4, e1.date) AND e1.date
AND e2.merit = 'behavior'
WHERE e1.merit = 'poem'
AND e2.child_id IS NULL
訣竅主要在于連接標準,我們希望確保我們vegetable在“行為”和“詩歌”之間匹配,同時還要檢查最后 4 小時。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/422530.html
標籤:
