根据动态日期过滤数据

时间:2018-09-15 09:35:52

标签: oracle-sqldeveloper

Create table #TEMP
(
ID INT
)

Create table #TEMP1
(
ID      INT,
Letter_Type   VARCHAR(100),
Letter_Sent_Date  DATE
)

INSERT INTO #TEMP VALUES (1),(2),(3),(4)
GO

INSERT INTO #TEMP1 VALUES
(1,'A','01/01/2017'),
(1,'B','01/02/2017'),
(1,'C','01/03/2018'),
(1,'D','01/04/2018'),
(2,'A','01/01/2017'),
(2,'B','01/02/2017'),
(2,'C','01/10/2018'),
(2,'D','01/12/2018')

我正在尝试取得以下结果-数据应基于日期。

假设我想知道在'01 / 05/2018'之后发送的C型字母的任何字母。 对于ID 1,没有字母C-在这种情况下,我们需要输出空值。

我正在尝试在单个语句中执行此操作,因为由于使用了几次联接,我目前拥有的查询非常大。

非常感谢您的帮助。谢谢!

OUTPUT
1,NULL,NULL
2,C,'01/10/2018'

2 个答案:

答案 0 :(得分:0)

这有点笨拙,但我认为它会返回您想要的内容(用Oracle编写)。

CTE(带分解子句)用于准备测试数据;您不需要这样做,因为您的数据已经在这两个表中了。有用的代码从第15行开始;看一下评论。

var leagueInfo = {"data":[{"tier":"Gold"},{"tier":"Bronze"}]};

Object.values(leagueInfo).map(function(dataArray) {
     console.log('5on5 ranked', dataArray);
    dataArray.map(function(values) {
       console.log('5on5 ranked', values.tier );
    })
})

答案 1 :(得分:0)

为了避免不存在/不存在的解决方案,也许可以为您提供帮助?

WITH TEMP (ID, LETTER_TYPE, LETTER_SENT_DATE) AS
     (select 1, 'A', date '2017-01-01' from dual union all
      SELECT 1, 'B', DATE '2017-02-01' FROM DUAL UNION ALL
      --SELECT 1, 'C', DATE '2018-03-01' FROM DUAL UNION ALL
      select 1, 'D', date '2018-04-01' from dual union all

      select 2, 'A', date '2017-01-01' from dual union all
      SELECT 2, 'B', DATE '2017-02-01' FROM DUAL UNION ALL
      SELECT 2, 'C', DATE '2018-10-01' FROM DUAL UNION ALL
      select 2, 'D', date '2018-12-01' from dual
     )
     SELECT ID, LETTER_TYPE, LETTER_SENT_DATE FROM TEMP
     WHERE LETTER_SENT_DATE > DATE '2018-05-01'
     AND LETTER_TYPE = 'C'
     UNION
    SELECT ID, NULL LETTER_TYPE, NULL LETTER_SENT_DATE
    from (
    select tt.id , sum(tt.HASLETTER) hasletter
    FROM 
     (SELECT T1.ID,  CASE WHEN (T1.LETTER_TYPE='C') THEN 1 ELSE 0 END HASLETTER --, NULL T1.LETTER_SENT_DATE 
     FROM TEMP T1) TT
     GROUP BY TT.ID
     ) hl

    where hl.hasletter = 0