SORU
27 Temmuz 2011, ÇARŞAMBA


Her grubun üst düzey 1 satır olsun

Her grup için son giriş almak istediğim bir tablo var. İşte tablo:

DocumentStatusLogs Tablo

|ID| DocumentID | Status | DateCreated |
| 2| 1          | S1     | 7/29/2011   |
| 3| 1          | S2     | 7/30/2011   |
| 6| 1          | S1     | 8/02/2011   |
| 1| 2          | S1     | 7/28/2011   |
| 4| 2          | S2     | 7/30/2011   |
| 5| 2          | S3     | 8/01/2011   |
| 6| 3          | S1     | 8/02/2011   |

Tablo Documentıd göre gruplandırılmış ve azalan oluşturma tarihi sıralanır. Her Documentıd için, son durumu almak istiyorum.

Benim tercih çıktı:

| DocumentID | Status | DateCreated |
| 1          | S1     | 8/02/2011   |
| 2          | S3     | 8/01/2011   |
| 3          | S1     | 8/02/2011   |
  • Herhangi bir toplama işlevi her gruptan sadece üst de olabilir. Pseudo-code GetOnlyTheTop aşağıya bakın:

    select DocumentID, GetOnlyTheTop(Status), GetOnlyTheTop(DateCreated) from DocumentStatusLogs group by DocumentID order by DateCreated desc

  • Eğer böyle bir işlevi yok eğer doğru değilse, istediğim çıktıyı elde etmek için herhangi bir yolu var mı?

  • Ya ilk yerde, bu normalleştirilmemiş veritabanı kaynaklanıyor olabilir mi? Aradığım şey sadece bir satır olduğu için almayı düşünüyorum, status da ana tabloda bulunması gerekir?

Lütfen daha fazla bilgi için ana tabloya bakın:

Güncel Documents Tablo

| DocumentID | Title  | Content  | DateCreated |
| 1          | TitleA | ...      | ...         |
| 2          | TitleB | ...      | ...         |
| 3          | TitleC | ...      | ...         |

Ana tablonun durumunu kolayca erişebilirsiniz, böylece bu gibi olmalıdır?

| DocumentID | Title  | Content  | DateCreated | CurrentStatus |
| 1          | TitleA | ...      | ...         | s1            |
| 2          | TitleB | ...      | ...         | s3            |
| 3          | TitleC | ...      | ...         | s1            |

GÜNCELLEME Ben kullanmayı öğreniyor "Uygula" hangisi daha kolay, bu tür sorunları çözmek için yapar.

CEVAP
27 Temmuz 2011, ÇARŞAMBA


;WITH cte AS
(
   SELECT *,
         ROW_NUMBER() OVER (PARTITION BY DocumentID ORDER BY DateCreated DESC) AS rn
   FROM DocumentStatusLogs
)
SELECT *
FROM cte
WHERE rn = 1

Eğer günde 2 girişleri düşünüyorsanız, o zaman bu keyfi bir seçim olacaktır. Bir gün için her iki girdileri almak için, DENSE_RANK kullanın

Değiştirilmiş ya da değil, eğer istersen bağlıdır

  • 2 yerde durumu korumak
  • durumu geçmişi korumak
  • ...

Bu haliyle, durumu geçmişi korumak. Son denormalisation) "" üst. durumu korumak için bir tetikleyici lazım üst tabloda da durum isterseniz ya da bu durumu geçmişi tablo açılır.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Alfredo Garcia

    Alfredo Garc

    25 Mayıs 2007
  • warningthepeople

    warningthepe

    21 EYLÜL 2011
  • William Hyde

    William Hyde

    23 HAZİRAN 2008