Sign Up

Sign Up to our social questions and Answers Engine to ask questions, answer people’s questions, and connect with other people.

Have an account? Sign In

Have an account? Sign In Now

Sign In

Login to our social questions & Answers Engine to ask questions answer people’s questions & connect with other people.

Sign Up Here

Forgot Password?

Don't have account, Sign Up Here

Forgot Password

Lost your password? Please enter your email address. You will receive a link and will create a new password via email.

Have an account? Sign In Now

You must login to ask a question.

Forgot Password?

Need An Account, Sign Up Here

Please briefly explain why you feel this question should be reported.

Please briefly explain why you feel this answer should be reported.

Please briefly explain why you feel this user should be reported.

Sign InSign Up

The Archive Base

The Archive Base Logo The Archive Base Logo

The Archive Base Navigation

  • Home
  • SEARCH
  • About Us
  • Blog
  • Contact Us
Search
Ask A Question

Mobile menu

Close
Ask a Question
  • Home
  • Add group
  • Groups page
  • Feed
  • User Profile
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Buy Points
  • Users
  • Help
  • Buy Theme
  • SEARCH
Home/ Questions/Q 305911
In Process

The Archive Base Latest Questions

Editorial Team
  • 0
Editorial Team
Asked: May 12, 20262026-05-12T07:25:04+00:00 2026-05-12T07:25:04+00:00

I have the following table lookup table in OLTP CREATE TABLE TransactionState ( TransactionStateId

  • 0

I have the following table lookup table in OLTP

CREATE TABLE TransactionState
(
    TransactionStateId INT IDENTITY (1, 1) NOT NULL,
    TransactionStateName VarChar (100)
)

When this comes into my OLAP, I change the structure as follows:

CREATE TABLE TransactionState
(
    TransactionStateId INT NOT NULL, /* not an IDENTITY column in OLAP */
    TransactionStateName VarChar (100) NOT NULL,
    StartDateTime DateTime NOT NULL,
    EndDateTime NULL
)

My question is regarding the TransactionStateId column. Over time, I may have duplicate TransactionStateId values in my OLAP, but with the combination of StartDateTime and EndDateTime, they would be unique.

I have seen samples of Type-2 Dimensions where an OriginalTransactionStateId is added and the incoming TransactionStateId is mapped to it, plus a new TransactionStateId IDENTITY field becomes the PK and is used for the joins.

CREATE TABLE TransactionState
(
    TransactionStateId INT IDENTITY (1, 1) NOT NULL,
    OriginalTransactionStateId INT NOT NULL, /* not an IDENTITY column in OLAP */
    TransactionStateName VarChar (100) NOT NULL,
    StartDateTime DateTime NOT NULL,
    EndDateTime NULL
)

Should I go with bachellorete #2 or bachellorete #3?

  • 1 1 Answer
  • 0 Views
  • 0 Followers
  • 0
Share
  • Facebook
  • Report

Leave an answer
Cancel reply

You must login to add an answer.

Forgot Password?

Need An Account, Sign Up Here

1 Answer

  • Voted
  • Oldest
  • Recent
  • Random
  1. Editorial Team
    Editorial Team
    2026-05-12T07:25:04+00:00Added an answer on May 12, 2026 at 7:25 am

    By this phrase:

    With the combination of StartDateTime and EndDateTime, they would be unique.

    you mean that they never overlap or that they satisfy the database UNIQUE constraint?

    If the former, then you can use the StartDateTime in joins, but note that it may be inefficient, since it will use a "<=" condition instead of "=".

    If the latter, then just use a fake identity.

    Databases in general do not allow an efficient algorithm for this query:

    SELECT  *
    FROM    TransactionState
    WHERE   @value BETWEEN StartDateTime AND EndDateTime
    

    , unless you do arcane tricks with SPATIAL data.

    That’s why you’ll have to use this condition in a JOIN:

    SELECT  *
    FROM    factTable
    CROSS APPLY
            (
            SELECT  TOP 1 *
            FROM    TransactionState
            WHERE   StartDateTime <= factDateTime
            ORDER BY
                    StartDateTime DESC
            )
    

    , which will deprive the optimizer of possibility to use HASH JOIN, which is most efficient for such queries in many cases.

    See this article for more details on this approach:

    • Converting currencies

    Rewriting the query so that it can use HASH JOIN resulted in 600% times performance gain, though it’s only possible if your datetimes have accuracy of a day or lower (or a hash table will grow very large).

    Since your time component is stripped of your StartDateTime and EndDateTime, you can create a CTE like this:

    WITH    cal AS
            (
            SELECT CAST('2009-01-01' AS DATE) AS cdate
            UNION ALL
            SELECT DATEADD(day, 1, cdate)
            FROM   cal
            WHERE  cdate <= '2009-03-01'
            ),
            state AS
            (
            SELECT  cdate, ts.*
            FROM    cal
            CROSS APPLY
                    (
                    SELECT  TOP 1 *
                    FROM    TransactionState
                    WHERE   StartDateTime <= cdate
                    ORDER BY
                            StartDateTime DESC
                    ) ts
            WHERE   ts.EndDateTime >= cdate
            )
    SELECT  *
    FROM    factTable
    JOIN    state
    ON      cdate = DATE(factDate)
    

    If your date ranges span more than 100 dates, adjust MAXRECURSION option on CTE.

    • 0
    • Reply
    • Share
      Share
      • Share on Facebook
      • Share on Twitter
      • Share on LinkedIn
      • Share on WhatsApp
      • Report

Sidebar

Related Questions

I have the following table structure CREATE TABLE `table` ( `id` int(11) NOT NULL
I have the following table schema; CREATE TABLE `db1`.`sms_queue` ( `Id` INTEGER UNSIGNED NOT
I have a simple lookup table, which consists of the following structure: int |
I have the following table in MySQL (version 5): id int(10) UNSIGNED No auto_increment
I have the following table and data in SQL Server 2005: create table LogEntries
I have the following table: I am trying to create an SQL query that
I have the following database structure: CREATE TABLE LookupTable ( PK UNIQUEIDENTIFIER PRIMARY KEY,
I have following table structure: Table: Plant PlantID: Primary Key PlantName: String Table: Party
I have the following table relationship in my database: Parent / \ Child1 Child2
I have the following table custid ordid qty datesold 1 A2 12 2008-01-05 2

Explore

  • Home
  • Add group
  • Groups page
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Users
  • Help
  • SEARCH

Footer

© 2021 The Archive Base. All Rights Reserved
With Love by The Archive Base

Insert/edit link

Enter the destination URL

Or link to existing content

    No search term specified. Showing recent items. Search or use up and down arrow keys to select an item.