簡體   English   中英

根據唯一鍵之間的比較選擇另一列的最新值

[英]Select latest value of another column based on a comparison between unique keys

我要實現的目標是基於同一msisdn (如果存在多個鏈接到其他imsimsisdn )來獲取另一列的最新日期。 (您可以假設imsi更多是唯一列)

為便於演示,表格被簡化

我有兩個如下表:

操作員

+--------+--------+---------------------+
|  imsi  | msisdn |    last_accessed    |
+--------+--------+---------------------+
| 74583  | 004442 | 2018-04-05 16:20:32 |
+--------+--------+---------------------+
| 94210  | 023945 | 2017-02-13 11:27:14 |
+--------+--------+---------------------+
| 59123  | 004442 | 2018-07-15 05:24:55 |
+--------+--------+---------------------+
| 61234  | 089923 | 2018-07-21 16:13:29 |
+--------+--------+---------------------+

客戶

+--------+--------------+---------------------+
|  imsi  |  company_id  |    business_plan    |
+--------+--------------+---------------------+
| 74583  |      FEX     |       yearly        |
+--------+--------------+---------------------+
| 94210  |      AOH     |       trial         |
+--------+--------------+---------------------+
| 59123  |      BIOI    |       monthly       |
+--------+--------------+---------------------+
| 61234  |      OOX     |       simple        |
+--------+--------------+---------------------+

以下結果是我的目標。 如果我搜索74583 ,則應返回2018-07-15 05:24:55

+--------+--------------+---------------------+----------------------+
|  imsi  |  company_id  |    business_plan    |  last_accessed_date  |
+--------+--------------+---------------------+----------------------+
| 74583  |      FEX     |       yearly        |  2018-07-15 05:24:55 |
+--------+--------------+---------------------+----------------------+

以下查詢幾乎返回了我嘗試實現的結果,但沒有根據上表返回最新日期。

SELECT 
    cust.imsi,
    cust.company_id,
    cust.business_plan,
    CASE
      WHEN
      (
        SELECT MAX(subop.last_accessed)
          FROM operator subop
            WHERE subop.msisdn = op.msisdn
              GROUP BY subop.msisdn
                HAVING COUNT(*) > 1
      )
      THEN
        op.last_accessed
      ELSE
        'Never'
    END
      AS last_accessed_date
FROM customer cust 
  INNER JOIN operator op
    ON cust.imsi = op.imsi
WHERE cust.imsi = '74583';

我們可以嘗試在select子句中使用相關子查詢來執行此操作:

SELECT
    c.imsi,
    c.company_id,
    c.business_plan,
    (SELECT MAX(t.last_accessed) FROM operator t
     WHERE t.msisdn = o.msisdn) last_accessed_date
FROM customer c
INNER JOIN operator o
    ON c.imsi = o.imsi
WHERE c.imsi = '74583';

請點擊下面的鏈接以獲取SQLFiddle演示。

演示

該查詢將為每個imsi返回last_accessed_date:

select
  o1.imsi,
  o1.msisdn,
  max(o2.last_accessed) as last_accessed_date
from
  operator o1 inner join operator o2
  on o1.msisdn = o2.msisdn
group by
  o1.imsi,
  o1.msisdn

(我將自己與operator表結合在一起,以基於msisdn列獲取上次訪問日期)。 然后,您可以將此查詢與客戶表一起加入:

select
  c.imsi,
  c.company_id,
  c.business_plan,
  coalesce(l.last_accessed_date, 'Never') as last_accessed_date
from
  customer c left join (
    select
      o1.imsi,
      o1.msisdn,
      max(o2.last_accessed) as last_accessed_date
    from
      operator o1 inner join operator o2
      on o1.msisdn = o2.msisdn
    group by
      o1.imsi,
      o1.msisdn
  ) l on c.imsi = l.imsi

然后可以用不同的方式編寫它,但是我認為這更容易理解。

請在這里查看小提琴http://sqlfiddle.com/#!9/0f080c/1

嘗試這個

 SELECT 
      cust.imsi,
      cust.company_id,
      cust.business_plan, 
      ( 
      SELECT MAX(last_accessed) FROM operator AS a WHERE a.msisdn = op.msisdn 
      ) AS last_accessed_date 
FROM customer cust 
      INNER JOIN operator op 
      ON cust.imsi = op.imsi 
WHERE cust.imsi = '74583'

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM