仅在第一行左联接

kse8i1jr  于 2021-07-29  发布在  Java
关注(0)|答案(2)|浏览(390)

我有以下示例查询:

  1. WITH a As
  2. (
  3. SELECT '2020-04-01' as date,'test123' as id,'abc' as foo,10 as purchases Union all
  4. SELECT '2020-04-01', 'test123', 'abc', 0 Union all
  5. SELECT '2020-04-01', 'test123', 'abc', 0
  6. ),
  7. b as
  8. (
  9. SELECT '2020-04-01' as date,'test123' as id,'abc' as foo,50 as budget
  10. )
  11. select
  12. a.date,a.id,a.foo,a.purchases,budget
  13. from a
  14. LEFT JOIN b
  15. ON
  16. concat(a.date,a.id)=concat(b.date,b.id)

我想要以下输出

  1. Row date,id,foo,purchases,budget
  2. 1 2020-04-01,test123,abc,10,50
  3. 2 2020-04-01,test123,abc,0,null
  4. 3 2020-04-01,test123,abc,0,null

我读了很多关于类似主题的问题,但我没能使它起作用。

fd3cxomn

fd3cxomn1#

你可以用 row_number() :

  1. select a.date, a.id, a.foo, a.purchases,
  2. (case when a.seqnum = 1 then b.budget end) as budget
  3. from (seleect a.*, row_number() over (partition by date, id order by purchases desc) as seqnum
  4. from a
  5. ) a
  6. b
  7. using (date, id);
px9o7tmv

px9o7tmv2#

在b inner查询中,将以下内容添加到所选列:
行号()在(按日期划分,按采购说明排序)上作为sequencenumber
然后在左边的连接中添加“and b.sequencenumber=1”
如果您真的对所有内容进行硬编码,而不是从实际表中进行选择,则可能是:

  1. WITH a As
  2. (
  3. SELECT '2020-04-01' as date,'test123' as id,'abc' as foo,10 as purchases Union all
  4. SELECT '2020-04-01', 'test123', 'abc', 0 Union all
  5. SELECT '2020-04-01', 'test123', 'abc', 0
  6. ),
  7. b as
  8. (
  9. SELECT '2020-04-01' as date,'test123' as id,'abc' as foo,50 as budget
  10. )
  11. select
  12. a.date,a.id,a.foo,a.purchases,budget
  13. from a
  14. LEFT JOIN b
  15. ON a.date = b.date
  16. AND a.id = b.id
  17. AND a.purchases > 0

否则,如果在内部“b”查询中有一个表。然后是这样的:

  1. WITH a As
  2. (
  3. SELECT '2020-04-01' as date,'test123' as id,'abc' as foo,10 as purchases Union all
  4. SELECT '2020-04-01', 'test123', 'abc', 0 Union all
  5. SELECT '2020-04-01', 'test123', 'abc', 0
  6. ),
  7. b as
  8. (
  9. SELECT '2020-04-01' as date,'test123' as id,'abc' as foo,50 as budget,
  10. ROW_NUMBER() OVER(PARTITION BY date ORDER BY Id) SequenceNumber
  11. )
  12. select
  13. a.date,a.id,a.foo,a.purchases,budget
  14. from a
  15. LEFT JOIN b
  16. ON a.date = b.date
  17. AND a.id = b.id
  18. AND b.SequenceNumber = 1
展开查看全部

相关问题