WINDOW functions
. का उपयोग करके यह मेरा समाधान है . मैंने lag
. का इस्तेमाल किया और lead
कार्य। दोनों वर्तमान पंक्ति से ऑफ़सेट में एक पंक्ति से एक कॉलम से एक मान लौटाते हैं। lag
वापस जाता है और lead
ऑफ़सेट में अगला जाता है।
SELECT tokcat.text
FROM (
SELECT text, category, chartype, lag(category,1) OVER w as previousCategory, lead(category,1) OVER w as nextCategory
FROM token t, textBlockHasToken tb
WHERE tb.tokenId = t.id
WINDOW w AS (
PARTITION BY textBlockId, sentence
ORDER BY textBlockId, sentence, position
)
) tokcat
WHERE 'NAME' = ANY(previousCategory)
AND 'NAME' = ANY(nextCategory)
AND 'NAME' <> ANY(category)
सरलीकृत संस्करण:
SELECT text
FROM (
SELECT text
,category
,lag(category) OVER w as previous_cat
,lead(category) OVER w as next_cat
FROM token t
JOIN textblockhastoken tb ON tb.tokenid = t.id
WINDOW w AS (PARTITION BY textblockid, sentence ORDER BY position)
) tokcat
WHERE category <> 'NAME'
AND previous_cat = 'NAME'
AND next_cat = 'NAME';
प्रमुख बिंदु
= ANY()
आवश्यकता नहीं है, विंडो फ़ंक्शन एकल मान देता है- सबक्वायरी में कुछ अनावश्यक फ़ील्ड
- स्तंभों के आधार पर आदेश देने की कोई आवश्यकता नहीं है, कि आप
PARTITION BY
- ORDER BY अंदर . पर लागू होता है विभाजन - उद्धरण के बिना मिश्रित केस पहचानकर्ताओं का उपयोग न करें, यह केवल भ्रम पैदा करता है। (बेहतर अभी तक:PostgreSQL में मिश्रित केस आइडेंटिफ़ायर का उपयोग न करें कभी भी )