SQL: استخدام أعلى 1 في الاستعلام UNION مع ترتيب حسب

StackOverflow https://stackoverflow.com/questions/842798

  •  20-08-2019
  •  | 
  •  

سؤال

ولدي الجدول على النحو التالي

Rate Effective_Date
---- --------------
5.6  02/02/2009
5.8  05/01/2009
5.4  06/01/2009
5.8  12/01/2009
6.0  03/15/2009

وأنا من المفترض أن تجد كل الأسعار التي هي فعالة للتاريخ الحالي وبعد ذلك. وذلك للحصول على معدل الفائدة الفعلي الحالي، وأنا استخدم

SELECT TOP 1 * from table 
where effective_date < '05/05/2009' 
order by effective date desc

ولمعدلات بعد التاريخ الحالي الاستعلام

SELECT * from table 
where effective_date > '05/05/2009'

لالجمع بين هذين نتيجة يمكنني استخدام اتحاد ك

SELECT TOP 1 * from table 
where effective_date < '05/05/2009' 
order by effective date desc

UNION

SELECT * from table 
where effective_date > '05/05/2009'

وتكون النتيجة المتوقعة

Rate Effective Date
---- --------------
5.8  05/01/2009
5.4  06/01/2009
5.8  12/01/2009
6.0  03/15/2009

ولكن يمكنني الحصول على النتيجة الفعلية ك

Rate Effective Date
---- --------------
5.6  02/02/2009
5.4  06/01/2009
5.8  12/01/2009
6.0  03/15/2009

وليس لدي أدنى فكرة لماذا يحدث هذا؟ أي اقتراحات؟

هل كانت مفيدة؟

المحلول

ويعمل بهذه الطريقة:

select *
from (
    select top 1 *
    from table
    where effective_date <= '05/05/2009'
    order by effective_date desc
) as current_rate

union all

select *
from table
where effective_date > '05/05/2009'

نصائح أخرى

ويتم تجاهل النظام من قبل في بيان حدد التي هي جزء من الاتحاد. وبالتالي بك TOP 1 هو اختيار بعض سجل التعسفي (على الأرجح السجل الأول بواسطة مفتاح المسافات للجدول).

طلب عن طريق غير صالح عند استخدامها مع الاتحاد ...

وأنا عملت حتى ضربة سريعة وقذرة ثينغي باستخدام التعبير الجدول المشترك مع بعض الرتبة وحالة بيان الخداع للحصول على النتائج التي تبحث عنها ..

WITH CTE_RATES ( RATE, EFFECTIVE_DATE, CUR, SORT )
AS (
    SELECT 
        Rate,
        Effective_date,
        CASE WHEN Effective_date > '5/5/2009' THEN 1
             ELSE 0
        END,
        RANK() OVER (PARTITION BY
                         CASE WHEN EFFECTIVE_DATE > '5/5/2009' THEN 1
                              ELSE 0
                         END
                     ORDER BY EFFECTIVE_DATE DESC)
    FROM TestTable
)

SELECT RATE, EFFECTIVE_DATE
FROM (
    SELECT RATE, EFFECTIVE_DATE 
    FROM CTE_RATES 
    WHERE CUR = 0 AND SORT = 1

    UNION ALL

    SELECT RATE, EFFECTIVE_DATE
    FROM CTE_RATES
    WHERE CUR = 1
    ) AS QRY
ORDER BY EFFECTIVE_DATE

لشرح ما يحدث ...

ووCTE يحدد معدل والتاريخ والاعلام الحالية والفرز عاد من الاستعلام ...

ومؤشر كيس يفصل النتائج إلى تلك التي هي قبل تاريخ البحث، وتلك التي هي بعد تاريخ البحث .. ونحن نستخدم النتائج من حالة (الوغد) في اتحادنا لسحب النتائج من القائمة تقسيم. .

وظيفة الرتبة () ثم فرز القائمة حسب إنشاء قسم على نفس المعايير التي يستخدمها بيان حالة للفصل بين القائمة .. ثم نحن تأمر من قبل تاريخ نفاذ تنازليا الموضة. وهذا سوف يستغرق قائمة "الماضية" وجعلها الأكثر الحالي "الماضي" دخول رتبة 1 ..

وبعد ذلك في الجزء اتحاد الاستعلام ..

في الجزء العلوي، ونحن الحصول على رتبة وتاريخ من قائمة "الماضية" (الحالي = 0) والإدخال الأول في قائمة "الماضية" .. (نوع = 1) .. التي سيعود 1 سجل (أو 0 إذا لم تكن هناك سجلات التي هي قبل تاريخ البحث) ..

وبعد ذلك يمكننا أن الاتحاد مع كل من سجل من قائمة "الحالية" (الحالي = 1)

وأخيرا .. ثم أخذنا نتائج UNION .. وهذا النظام من قبل تاريخ نفاذ إعطائنا كافة السجلات الحالية، و "معظم الحالي" الرقم القياسي السابق.

وأعتقد أن الأسئلة المذكورة أعلاه باستثناء 05/01/2009 باستخدام <و> بدلا من <= و> =.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top